Fortran中的指针如何使用,功能怎样,下面的的5个例子足可以让你明白一切!

对于单个值,用起来很简单,但是无法体现指针的强大功能,

示例1:

program test_pointer_1
implicit none
integer,pointer::p1,p2 !定义指针
integer::s
!------------------------------------
ALLOCATE(p1,p2) !分配内存空间
read(*,*)p1,p2
s=p1+p2
write(*,*)'s=',s
Deallocate(p1,p2) !释放内存空间
!------------------------------------
end program test_pointer_1

用指针来操作数组,可以随意引用数组中的任意片段,是指针的强大功能之一,

请看下面的示例2:

program test_pointer_2
implicit none
integer,pointer::a(:)
integer,target::b(5)=(/1,2,3,4,5/)
!-----------------------------------------
!---引用整个数组
a=>b ! a(1)=1;a(2)=2;a(3)=3;a(4)=4;a(5)=5
write(*,*) 'a=>b ',a
!-----------------------------------------
!---引用数组连续的片段
a=>b(2:3) ! a(1)=2;a(2)=3
write(*,*) 'a=>b(2:3) ',a
!-----------------------------------------
!---引用数组不连续的片段
a=>b(1:5:2) ! a(1)=1;a(2)=3;a(3)=5
write(*,*) 'a=>b(1:5:2) ',a
!-----------------------------------------
!---引用数组的倒序(相当于将数组左右颠倒)
a=>b(5:1:-1) ! a(1)=5;a(2)=4;a(3)=3;a(4)=2;a(5)=1
write(*,*) 'a=>b(5:1:-1) ',a
!------------------------------------
end program test_pointer_2

如果是二维数组,想引用某行或者某列的数据,

请看示例3:

program test_pointer_3
implicit none
Integer::i,j,k
real,pointer::a(:)
real,target::b(3,4)
!-----------------------------------------
!---二维数组赋初值
!data b/1,2,3,4,5,6,7,8,9,10,11,12/
data ((b(i,j),i=1,3),j=1,4)/1,2,3,4,5,6,7,8,9,10,11,12/
!-----------------------------------------
!---打印二维数组内容
do i=1,3
write(*,*) b(i,:)
end do
!-----------------------------------------
!---引用二维数组第二行
a=>b(2,:)
write(*,*) 'a=>b(2,:) ',a
!-----------------------------------------
!---引用二维数组第三列
a=>b(:,3)
write(*,*) 'a=>b(:,3) ',a
!------------------------------------
end program test_pointer_3

程序运行结果如下:

上面的指针是一维的,对于用二维指针来引用二维数组中的二维片段也是同样方便,

请看示例4:

program test_pointer_4
implicit none
Integer::i,j,k
real,pointer::p(:,:) !二维的指针
real,target::b(3,4)
!-----------------------------------------
!---二维数组赋初值
!data b/1,2,3,4,5,6,7,8,9,10,11,12/
data ((b(i,j),i=1,3),j=1,4)/1,2,3,4,5,6,7,8,9,10,11,12/
!-----------------------------------------
!---打印二维数组内容
write(*,*) 'b(3,4)'
do i=1,3
write(*,*) b(i,:)
end do
!-----------------------------------------
!---引用二维数组中的二维片段
p=>b(1:2,2:3)
write(*,*) 'p=>b(1:2,2:3)'
do i=1,2
write(*,*) p(i,:)
end do
!-----------------------------------------
p=0 !将b(1:2,2:3)中的元素置为0
!---打印二维数组内容
write(*,*) 'b(3,4)'
do i=1,3
write(*,*) b(i,:)
end do
!------------------------------------
end program test_pointer_4

运行如下:

把指针当做动态数组来使用,也是很方便的:

program test_pointer_5
implicit none
Integer::i
real,pointer::p(:) !利用指针为数组动态分配内存
!-----------------------------------------
allocate(p(5)) !---为数组(指针)分配内存空间
!-----------------------------------------
!---数组赋值
do i=1,5
p(i)=i*2
end do
!-----------------------------------------
write(*,*) 'p(5)=',p !p(5)=2,4,6,8,10
!-----------------------------------------
deallocate(p) !---为数组(指针)释放内存空间
end program test_pointer_5

上面的指针使用是最初级的,高级的用法还有实现指针链表和type类型的指针数组等

对于指针下面的语句代码常常用到:

! 常用语句
! POINTER_C=>NULL(); ! 指针指向NULL
! NULLIFY(PTR_A); ! 指针指向NULL
! STATUS = ASSOCIATED (C); ! 如果C有所指向返回TRUE
! STATUS = ASSOCIATED (C, E); ! 如果C指向E返回TRUE,如果C和E指向的目标相同或者二者均为NULL返回TRUE(二者都是指针)

Fortran中的指针使用的更多相关文章

  1. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  2. c++中this指针的用法

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  3. 在c#中使用指针

    如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...

  4. c中的指针

    一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int  n)函数 ...

  5. 关于Vector中的元素中含有指针成员的情况

    对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...

  6. C++中this指针的用法详解

    转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...

  7. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  8. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  9. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

随机推荐

  1. android录音实现不再担心—一个案例帮你解决你的问题

    最近有小伙伴经常android的录音怎么实现,有没有相关的案例.今天给大家推荐一个android中实现录音和播放的小案例. 效果图: 一.实现录音的 Service 关键代码: // 开始录音 pub ...

  2. 神经网络,前向传播FP和反向传播BP

    1 神经网络 神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入.例如,下图就是一个简单的神经网络: 我们使用圆圈来表示神经网络的输入,标上“”的圆 ...

  3. OI中坑点总结

    以下是我个人OI生涯中遇到的坑点的一个小总结,可能是我太菜了,总是掉坑里,请大佬勿喷 1,多重背包的转移的循环顺序 //默认每个物品体积为一(不想打码……) //dp[i]表示占用背包容量i所能获得的 ...

  4. python 全栈开发,Day72(昨日作业讲解,昨日内容回顾,Django多表创建)

    昨日作业讲解 1.图书管理系统 实现功能:book单表的增删改查 1.1 新建一个项目bms,创建应用book.过程略... 1.2 手动创建static目录,并在目录里面创建css文件夹,修改set ...

  5. VEMap.DeleteAllShapeLayers 方法

    来源:https://msdn.microsoft.com/zh-cn/library/bb412514.aspx <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  6. Docker 启动时容器无法联网

    转自:https://blog.csdn.net/u014062332/article/details/52911405 启动docker web服务时 虚拟机端口转发 外部无法访问 centos 7 ...

  7. java07接口与继承动手动脑

    1.源代码: package Work; class A{ public A(){ System.out.println("Class A."); } public A(Strin ...

  8. 微信小程序介绍

    1.什么是微信小程序 是一种不需要下载即可使用的应用,实现了“触手可及的梦想”,用户扫一扫或者搜一下即可打开. 免安装 操作更接近原始的APP 必须在微信中使用 2.宣传方式 小程序搜索入口 附近的小 ...

  9. java语言打印上三角和下三角,进一步得到九九乘法表

    关于下面两种图形的打印问题 ***** 与 * ****  ** *** *** ** **** *  ***** 一:程序 1.先打印下三角 2.结果 3.后打印上三角 4.结果 二:知识点 1.f ...

  10. java实体转json忽略属性

    1: import com.alibaba.fastjson.annotation.JSONField; fastjson 过滤指定字段 @JSONField(serialize=false)priv ...