Fortran指针初探

! Fortran 中的指针初探
! 1 标准fortran指针并不代表变量在内存中的地址,
!   而是代表这个变量的别名,相当与C中的引用。
!   通过指针,同一个变量存储单元可以通过多个变量名来访问。
! 2 当指针被声明后,程序并不会立即给它分配存储空间,
!   而是要等到通过allocate语句进行动态内存分配或者通过指针赋值语句
!   与一个目标变量联合起来后才会分配。
!   目标变量都必须在程序的声明阶段被赋予target属性
program helloworld
implicit none

integer                     :: i, j
integer, pointer            :: p1, p2
integer, target             :: s = 12
integer, pointer            :: a(:)
integer, target             :: b(5) = (/1,2,3,4,5/)
integer, target             :: c(3,4)
integer, pointer            :: d(:,:)

! 对二维数组c的初始化
do j = 1, 4
    do i = 1, 3
        c(i, j) = (i -1) * 4 + j
    end do
end do

print *, ' c = '
do i=1, 3
    print *, c(i, :)
end do

! ---------------------以上为初始化工作------------------------

! 1 --------对于单个值的使用---
p1 => s; p2 => s;
s = 20; p1 = 30  ! pointer的改变会影响target值的变化
print *, s, p1, p2
! 2 --------通过指针对数进行一些列操作---
a => b                      ! 引用整个数组
print *, 'a=>b ', a
a => b(2:4)                 ! 对数组连续片段的引用
print *, 'a=>b(2:4) ', a
a => b(1:5:2)               ! 对数组不连续片段的使用
print *, 'a=>b(1:5:2) ', a
a => b(5:1:-1)              ! 引用数组的倒序
print *, 'a=>(5:1:-1) ', a
! 3 ---------一维指针对二维数组片段的引用
a => c(:, 3)                ! 引用第三列数据
print *, 'a=>c(:,3) ', a
a => c(2, :)                ! 引用第二行数据
print *, 'a=>c(2,:) ', a
! 4 ---------二维指针对二维数组的引用
d => c(1:2, 2:3)            ! 引用二维数组中的二维片段
print *, 'd => c(1:2, 2:3)'
do i=1, 2
    print *, d(i, :)
end do
d=121                         ! 对c(1:2,2:3)中的元素重新赋值 
print *, 'c(3, 4)'
do i=1, 3
    print *, c(i, :)
end do
! 5 -----------指针当做动态数组来使用
allocate(a(4))          ! 为指针分配空间
do i=1, 4
    a(i) = i * 3
end do
print *, 'a(4) = ', a
deallocate(a)           ! 为指针释放引用的内存空间

! 6 ---指针的状态可以通筧ssociated(pointer,target)来检查指针是否设置了指向,
!       返回值为逻辑型变量?
!       还可通过NULLIFY来解除指针当前的联合状态,并使其指向不能使用的内存地址。
print *, associated(d) 
NULLIFY(d)
print *, associated(d) 

end program helloworld

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADreamClusive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值