主题:[讨论]请各位大虾谈谈对fortran中指针的使用的一些体会及建议
指针是一个很有趣的东西,它最简单的应用可以用来保存变量,或者是动态使用内存,或者是用于数据结构,fortran中也有指针变量。
下面给出fortran中指针的一些基本用途及例子
! 常用语句
! pointer_c=>null(); ! 指针指向null
! nullify(ptr_a); ! 指针指向null
! status = associated (c); ! 如果c有所指向返回true
! status = associated (c, e); ! 如果c指向e返回true,如果c和e指向的目标相同或者二者均为null返回true(二者都是指针)
!例子1:
Program test
real,target::r1=1.0,r2=2.0;
!target::specifies that an object can become
!the target of a pointer (it can be
!pointed to).
real,pointer::p1,p2;
!specifies that an object is a pointer (a dynamic variable).
!a pointer does not !contain data, but points to a scalar or array
!variable where data is stored.
!a pointer has no initial storage set aside for it;
!memory storage is created for the pointer as a program runs.
p1=>r1; !指针p1指向r1的内存地址
p2=>r2; !指针p2指向r2的内存地址
write(*,*)p1,p2; ! 1.0 2.0
p1=p2; ! p1也指向r2了
write(*,*)p1,p2; ! 2.0 2.0
p1=>r1;
p2=>r2;
p1=>p2; ! 与p1=p2作用相同
write(*,*)p1,p2; ! 2.0 2.0
allocate(p1); !为p1分配内存空间
p1=10; !p1赋值为10
write(*,*)p1;
! p1=>p2; ! 如果用了此语句,原来分配的空间丢失,此时执行deallocate操作出错
deallocate(p1); ! 释放指针所指向的空间
end program test
指针变量保存的是一个‘内存地址’,当程序要读写指针变量时,实际上会经过两个步骤
(1)取出指针中所保存的内存位置
(2)到这个内存位置读写数据
指针变量所保持的内存地址来由可以有两种:
(1)记录其他非指针变量的内存地址
(2)程序执行中动态分配的一块内存
例子2:
<彭国伦-fortran 95程序设计>
program ex1001
implicit none
integer, target :: a=1
! 声明一个可以当做目标的变量
integer, pointer :: p
! 声明一个可以指向整数的指针
p=>a ! 把指针p指到变量a
write(*,*) p
a=2 ! 改变a的值
write(*,*) p
p=3 ! 改变指针p指向的内存内容
write(*,*) a
write(*,*) p
stop
end
指针也可以声明成数组,声明成数组的指针可以有两种使用方法:
(1)把指针指到其他数组
(2)配置内存空间使用。
例子1:
<彭国伦-Fortran 95程序设计>
program ex1004
implicit none
integer, pointer :: a(:)
integer, target :: b(5)=(/ 1,2,3,4,5 /)
! 把指针数组a指向数组b
a=>b
! a(1??5)=>b(1??5)
write(*,*) a
a=>b(1:3)
! a(1)=>b(1), a(2)=>b(2), a(3)=>b(3)
write(*,*) a
a=>b(1:5:2)
! a(1)=>b(1), a(2)=>b(3), a(3)=>b(5)
write(*,*) a
a=>b(5:1:-1)
! a(1)=>b(5), a(2)=>b(4), a(3)=>b(3), a(4)=>b(2), a(5)=>b(1)
write(*,*) a
stop
end
注意,指针数组在声明时只需要说明它的维数,不需要说明它的大小。类似可变大小数组。
在程序中常常需要使用数组的一小部分时,声明一个指针来使用这一部分数组,会比较方便。
下面给出fortran中指针的一些基本用途及例子
! 常用语句
! pointer_c=>null(); ! 指针指向null
! nullify(ptr_a); ! 指针指向null
! status = associated (c); ! 如果c有所指向返回true
! status = associated (c, e); ! 如果c指向e返回true,如果c和e指向的目标相同或者二者均为null返回true(二者都是指针)
!例子1:
Program test
real,target::r1=1.0,r2=2.0;
!target::specifies that an object can become
!the target of a pointer (it can be
!pointed to).
real,pointer::p1,p2;
!specifies that an object is a pointer (a dynamic variable).
!a pointer does not !contain data, but points to a scalar or array
!variable where data is stored.
!a pointer has no initial storage set aside for it;
!memory storage is created for the pointer as a program runs.
p1=>r1; !指针p1指向r1的内存地址
p2=>r2; !指针p2指向r2的内存地址
write(*,*)p1,p2; ! 1.0 2.0
p1=p2; ! p1也指向r2了
write(*,*)p1,p2; ! 2.0 2.0
p1=>r1;
p2=>r2;
p1=>p2; ! 与p1=p2作用相同
write(*,*)p1,p2; ! 2.0 2.0
allocate(p1); !为p1分配内存空间
p1=10; !p1赋值为10
write(*,*)p1;
! p1=>p2; ! 如果用了此语句,原来分配的空间丢失,此时执行deallocate操作出错
deallocate(p1); ! 释放指针所指向的空间
end program test
指针变量保存的是一个‘内存地址’,当程序要读写指针变量时,实际上会经过两个步骤
(1)取出指针中所保存的内存位置
(2)到这个内存位置读写数据
指针变量所保持的内存地址来由可以有两种:
(1)记录其他非指针变量的内存地址
(2)程序执行中动态分配的一块内存
例子2:
<彭国伦-fortran 95程序设计>
program ex1001
implicit none
integer, target :: a=1
! 声明一个可以当做目标的变量
integer, pointer :: p
! 声明一个可以指向整数的指针
p=>a ! 把指针p指到变量a
write(*,*) p
a=2 ! 改变a的值
write(*,*) p
p=3 ! 改变指针p指向的内存内容
write(*,*) a
write(*,*) p
stop
end
指针也可以声明成数组,声明成数组的指针可以有两种使用方法:
(1)把指针指到其他数组
(2)配置内存空间使用。
例子1:
<彭国伦-Fortran 95程序设计>
program ex1004
implicit none
integer, pointer :: a(:)
integer, target :: b(5)=(/ 1,2,3,4,5 /)
! 把指针数组a指向数组b
a=>b
! a(1??5)=>b(1??5)
write(*,*) a
a=>b(1:3)
! a(1)=>b(1), a(2)=>b(2), a(3)=>b(3)
write(*,*) a
a=>b(1:5:2)
! a(1)=>b(1), a(2)=>b(3), a(3)=>b(5)
write(*,*) a
a=>b(5:1:-1)
! a(1)=>b(5), a(2)=>b(4), a(3)=>b(3), a(4)=>b(2), a(5)=>b(1)
write(*,*) a
stop
end
注意,指针数组在声明时只需要说明它的维数,不需要说明它的大小。类似可变大小数组。
在程序中常常需要使用数组的一小部分时,声明一个指针来使用这一部分数组,会比较方便。