Skip to content

Commit

Permalink
Create ch08-03-pointertips.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Euler-37 authored Mar 31, 2024
1 parent b6eb6c4 commit 83e20f1
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions src/ch08-03-pointertips.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# 指针的小技巧

## 数组的维数变换
Fortran中的数组在定义了维数之后,一般是不可变的。这是我们可以使用指针来为其设置一个别名

``` fortran
integer,target::a(4,4)
integer,pointer::pa(:)
pa(1:size(a))=>a !此时需要设置指针的宽度,且右边只能是一维或者连续的数组
```
这时候我们就获得了一个`a`的一维数组别名
``` fortran
integer::i
pa=[(i,i=1,16)]
write(*,*)pa(1::size(a,dim=1)) !获取对角项
```

如果在子程序或者函数中,我们则需要为数组设置`contiguous`关键字
```
program main
real,target::a(10,10)
integer::i
real,pointer::p(:)
a=reshape([(i,i=1,100)],shape(a)) !使用reshape为数组赋初值
p=>diag(a) !使用指针获取对角项
write(*,*)p
p=[real::(i,i=111,120)] !修改对角项,此时p拿到的是对角项的引用,所以修改了之后,a的对角项也会改变
do i=1,10
write(*,*)a(i,i)
end do
contains
function diag(a)result(ptr)
real,intent(in),target,contiguous::a(:,:) !需要加contiguous属性
real,pointer::ptr(:)
ptr(1:size(a))=>a
ptr=>ptr(1::size(a,dim=1)+1) !取对角项
end function diag
end program main
```
- `contiguous`属性对于数组的连续性做了强制要求,有时候**可以使得编译器做出更好的优化,提高代码运行速度**,因此在普通的含数组的过程中,也可以选择使用
## 思考题
- 如果传入的是数组的切片,那么还能用上述的方法修改吗

0 comments on commit 83e20f1

Please sign in to comment.