Fortran中的指针使用
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中的指针使用的更多相关文章
- 【实战Java高并发程序设计 1】Java中的指针:Unsafe类
是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...
- c++中this指针的用法
1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...
- 在c#中使用指针
如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...
- c中的指针
一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int n)函数 ...
- 关于Vector中的元素中含有指针成员的情况
对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...
- C++中this指针的用法详解
转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...
- C语言中的指针数组
C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
随机推荐
- Oracle 数据库逻辑结构
注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. Oracle 数据库逻辑结构 一.存储关系 Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据 ...
- Renderscript图像处理
作者:慧能 最近正在学习renderscript,后期会整理一篇完整的文档,先记着.... https://blog.csdn.net/codemydream/article/details/5346 ...
- hdu4605
两颗线段树,分别维护向左走向右走的情况 线段树的结点维护区间有多少点被路径经过了 离线读入所有询问,dfs遍历树的每一个结点,访问到v时解决对v的所有查询,在dfs过程中只需要维护根节点到v的链,线段 ...
- C#中的预处理指令详解
这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregion ...
- Centos7.1 mini版安装后安装图形界面教程
[1]GNOME安装 1.执行下面命令安装GNOME Desktop Environment yum -y groups install "GNOME Desktop" 2.安装完 ...
- WPF插件开发:使用FrameworkElementAdapters时VS报错的问题
使用MAF开发插件时FrameworkElementAdapters是个坑,查帮助手册发现这个类位于System.AddIn.Pipeline命名空间中,但是添加System.AddIn的引用后发现V ...
- .NetCore下利用Jenkins如何将程序自动打包发布到Docker容器中运行
说道这一块纠结了我两天时间,感觉真的很心累,Jenkins的安装就不多说了 这里我们最好直接安装到宿主机上,应该pull到的jenkins版本是2.6的,里面很多都不支持,我自己试了在容器中安装的情况 ...
- 结构型模式之Adapter模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口. 在JDK中的体现 把一个接口或类变成另外一种. java.util.Arrays#asList()javax.swing.JTable(Tab ...
- 024 IDEA不能新建spring下的配置文件xml
这个问题以前就遇到过,一直懒得解决,现在必须要用了,解决了一下,发现网上的解决方式果然不错. 1.现象 2.解决方式 需要添加一下spring context的依赖即可
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...