刚开始看到这个的时候我很吃惊,原谅我这个从来不看书籍目录的人,我都不知道Fortran这么老的语言居然有指针,这不得好好的和c++比较一下。
先看看书里对指针的定义:
指针是一种间接使用数据的方法,指针变量用来保存一个内存地址,当程序要读写指针变量的时候,实际上要经过两个步骤:
1、取出指针中所保存的内容位置
2、到这个内存位置去读写数据。
指针变量所保存的内存地址的来源有两种:
1、记录其他非指针变量的内存位置
2、程序执行中动态配置一块内存
最基本的指针运行,就是把指针变量拿来记录另外一个目标变量的地址,在经过指针来读写数据。
Fortran这个还不是c++这种:
int *q
人直接时pointer
跟着书来一个:
program main
implicit none
integer,TARGET::a=1
!声明一个可以当成目标的变量
integer,pointer::p
! 声明一个可以指向整数的指针
p=>a
!把指针p指到变量a
write(*,*)p
a=2
write(*,*)p
p=3
write(*,*)a
stop "over"
end
声明中有一个target的变量,这种变量可以把他的内存地址赋值给指针变量。
也可以这样子:
program main
implicit none
integer,POINTER::p
ALLOCATE(p)
!配置一块可以存放integer的内存空间给p
p=100
! 得到内存后的指针p可以像一般整数一样来使用
write(*,*)p
stop
end
经过allocate的指针,要使用deallocate释放,如果不先deallocate就重新设置指针p的指向,就会导致内存空间浪费。
可以用associated(pointer,【target】)来判断指针是否已经设置指向
如果是null()的话,就会返回一个不能使用的内存地址,在指针还没指向前设置成这个值,associated就不会报错。
也可以用nullify(pointer1,【pointer2、pointer3...】)也可以把指针设置成没有指向任何内存地址。
来一个实验:
program main
implicit none
integer,POINTER::a=>null()
integer,TARGET::b=1,c=2
write(*,*)ASSOCIATED(a)
! false,这个时候啊还没有被赋值
a=>c
write(*,*)ASSOCIATED(a)
! true,a已经被赋值
write(*,*)ASSOCIATED(a,c)
! true,a指向c
write(*,*)ASSOCIATED(a,b)
! false,a不指向b
NULLIFY(a)
! 把指针a设为没有指向
write(*,*)ASSOCIATED(a)
! false,a还没有被赋值
stop "over"
end
指针可以声明成任何数据类型,甚至是type来自定义的数据类型。,不论integer、real等或是自定义类型,每一种指针变量都占用咸通的内存空间,因为执政变量实际上只是记录内存地址。