Skip to content

Commit 83e20f1

Browse files
authored
Create ch08-03-pointertips.md
1 parent b6eb6c4 commit 83e20f1

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/ch08-03-pointertips.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 指针的小技巧
2+
3+
## 数组的维数变换
4+
Fortran中的数组在定义了维数之后,一般是不可变的。这是我们可以使用指针来为其设置一个别名
5+
6+
``` fortran
7+
integer,target::a(4,4)
8+
integer,pointer::pa(:)
9+
pa(1:size(a))=>a !此时需要设置指针的宽度,且右边只能是一维或者连续的数组
10+
```
11+
这时候我们就获得了一个`a`的一维数组别名
12+
``` fortran
13+
integer::i
14+
pa=[(i,i=1,16)]
15+
write(*,*)pa(1::size(a,dim=1)) !获取对角项
16+
```
17+
18+
如果在子程序或者函数中,我们则需要为数组设置`contiguous`关键字
19+
```
20+
program main
21+
real,target::a(10,10)
22+
integer::i
23+
real,pointer::p(:)
24+
a=reshape([(i,i=1,100)],shape(a)) !使用reshape为数组赋初值
25+
p=>diag(a) !使用指针获取对角项
26+
write(*,*)p
27+
p=[real::(i,i=111,120)] !修改对角项,此时p拿到的是对角项的引用,所以修改了之后,a的对角项也会改变
28+
do i=1,10
29+
write(*,*)a(i,i)
30+
end do
31+
contains
32+
function diag(a)result(ptr)
33+
real,intent(in),target,contiguous::a(:,:) !需要加contiguous属性
34+
real,pointer::ptr(:)
35+
ptr(1:size(a))=>a
36+
ptr=>ptr(1::size(a,dim=1)+1) !取对角项
37+
end function diag
38+
end program main
39+
```
40+
- `contiguous`属性对于数组的连续性做了强制要求,有时候**可以使得编译器做出更好的优化,提高代码运行速度**,因此在普通的含数组的过程中,也可以选择使用
41+
## 思考题
42+
- 如果传入的是数组的切片,那么还能用上述的方法修改吗
43+

0 commit comments

Comments
 (0)