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. wap页面

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. js数值进制互转

    十进制转换为二进制: var num = 100; console.log(num.toString(2)); toString()方法可把一个 Number 对象转换为一个字符串,并返回结果. 语法 ...

  3. iOS学习笔记之异步图片下载

    写在前面 在iOS开发中,无论是在UITableView还是在UICollectionView中,通过网络获取图片设置到cell上是较为常见的需求.尽管有很多现存的第三方库可以将下载和缓存功能都封装好 ...

  4. 使用Struts,实现简单的登录

    一.新建项目Struts 1.右键 new————Web Project 2.点击项目——右键——myeclipse——add Struts Capabilities.....——选择struts2. ...

  5. hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误

    hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误 起因 ...

  6. java中关于重载与重写的区别

    1.重载 允许多个同名但是形式参数个数或参数类型不同的方法存在同一个类中,在调用时根据形式参数列表来调用对应的方法. 2.判断 (1):方法名必须相同. (2):形式参数个数不同或者参数类型不同(满足 ...

  7. php特别值

    if(!isset($lichi)){ echo'未定义'; if(empty($lichi)){ echo '未定义的显示为空的';//最终会走到这来 } } 手册类型比较表 empty为真$x = ...

  8. moodleform -转载于blfshiye

    Form API 表单API 文件夹 1.概述 2.亮点 3.使用方法 4.表单元素 4.1 基本表单元素 4.2 定制表单元素 5.经常使用函数 5.1  add_action_buttons($c ...

  9. hdu 1166 敌兵布阵【线段树】(求给定区间和)

    题目链接:https://vjudge.net/contest/182746#problem/B       敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)   ...

  10. HBase 开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 首先, 搭建基于MyEclipse的Hadoop开发环境 相信,能看此博客的朋友,想必是有一定基础的了.我前期写了大量的基础性博文.可以去补下基础. 比如, CentOS图形界面下如何安 ...