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 不同类型的间接寻址 /// ...
随机推荐
- STM32应用实例六:与MS5837压力传感器的I2C通讯
MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器,灵敏度非常高,理论上能够检测到0.01mbar的压力变化,实际使用过程中测试并无明显的变化. MS5837 ...
- (三)使用CXF开发WebService客户端
前面一讲开发了webservice服务器端接口,今天的话,我们来开发webservice客户端,让大家来体验下过程: 首先建一个Maven项目,项目名字,WS_Client: 然后我们要用CXF给我们 ...
- python 全栈开发,Day138(scrapy框架的下载中间件,settings配置)
昨日内容拾遗 打开昨天写的DianShang项目,查看items.py class AmazonItem(scrapy.Item): name = scrapy.Field() # 商品名 price ...
- python 全栈开发,Day59(小米商城)
一.小米商城 准备工作: 访问iconfont,官网链接: http://www.iconfont.cn/ 登录之后,找到需要的图标 将图标下载到本地,解压,重命名为font创建几个空文件夹:css, ...
- requirejs模块路径配置问题
三种情况:一.设置data-main,没配置baseUrl,以data-main的文件为基准:二.设置data-main,配置baseUrl,baseUrl以值以引用require.js的HTML为基 ...
- TopCoder FlowerGarden【拓扑排序】
https://community.topcoder.com/stat?c=problem_statement&pm=1918&rd=5006拓扑排序,每次选择最大的就好了 #incl ...
- [CodeChef]GERALD07/[JZOJ4739]Ztxz16学图论
题解: 考虑从小到大枚举右端点 对于每个点,令它的权值等于它的编号 那么我们可以用lct维护出一颗最大生成树 维护方法是每次插入一条判断他们在不在一颗树上 若不在直接加,若在就找到链上的最小值 之后看 ...
- json转成java对象
avro生成的代码里,String是CharSequence,不能通过Gson反序列化,于是有了下面的代码,ParseArray里还不完善: static <T> List<T> ...
- 【spring基础】spring声明式事务详解
一.spring声明式事务 1.1 spring的事务管理器 spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事务实现.spring容器负责事物的 ...
- Kubernetes学习系列
这段时间项目组内想要引入Kubernetes,作为第二代容器调度引擎,故最近在系统的学习Kubernetes.整理了一些学习笔记,心得,放到博客中,一来记录自己的学习经过,二来看能否帮到有需要的同学. ...