个人理解,欢迎指正

指针就是记录数据的内存地址的变量。指针可以指向单个变量,也可以指向数组。

数组是一个概念,是若干个类型相同的元素的有序集合。在Fortran语言中,数组中存放的元素,可以是整数,实数,复数,甚至结构体(或称自定义数据类型)。但是,在Fortran中,数组中存放的元素不能是指针。不存在这样一个数组,该数组的每一个元素都是一个指针,分别指向不同的数组。

那么怎样才能实现,有一个数组,而数组中每一个元素都能指向其它数组呢?

因为数组中存放的元素可以是结构体,那么可以通过定义一个结构体,在结构体中定义一个指针变量来解决。

type container
class(object), pointer :: obj
end type container type(container), allocatable, dimension(:) :: objects
allocate (objects(:num_objects))
objects()%obj => s1

其中,objects(0:num_objects)就是定义的结构体数组,数组中的第0个元素的obj分量(objects(0)%obj)指向一个变量s1,s1是类型为object的变量。

上式objects数组中的每一个元素都是指向单个变量的,那么如果需要结构体数组中的每一个元素都指向一个数组,则定义结构体中的指针变量需要定义为是指向数组的(下面第10行):

 program ex1
implicit none
integer :: i,j !//声明目标数组work
real(RK),allocatable,target :: work(:,:) !//定义结构体类型qcontainer,该类型中的分量obj可以指向一个一维的数组
type qcontainer
real(RK),pointer :: obj(:)
end type qcontainer !//声明一个一维的的数组qtwork
type(qcontainer),allocatable :: qtwork(:) !//定义数组work并赋初值
allocate(work(,))
do i=,
do j=,
work(i,j)=i*j***
end do
end do !//定义数组qtwork
allocate(qtwork()) !//qtwork中第j个元素的object分量指向数组work的第j列
qtwork(j)%obj => work(:,j) end program ex1

关于彭书中的“”指针数组“

彭国伦《Fortran95程序设计》书中275页上说,“指针也可以声明成数组”,并给了以下示例代码

 program ex1004
implicit none
integer, pointer :: a(:)
integer, target :: b()=(/ ,,,, /)
! 把指针数组a指向数组b
a=>b
! a(~)=>b(~)
write(*,*) a
a=>b(:)
! a()=>b(), a()=>b(), a()=>b()
write(*,*) a
a=>b(::)
! a()=>b(), a()=>b(), a()=>b()
write(*,*) a
a=>b(::-)
! a()=>b(), a()=>b(), a()=>b(), a()=>b(), a()=>b()
write(*,*) a
stop
end

这里用指针a表示了数组b。这告诉我们,指针不仅可以指向单个变量的内存地址,还可以指向数组。

但是需要注意的是,指针a(:)中的每一个变量a(i)都确定的表示了某一个单独的变量,而不是表示变量的集合的数组即指针a(:)只能表示一个数组,不能同时表示多个数组的集合。

另外,需要注意,声明指针a的时候,可以说明a的形状,但不能指定a的数组大小。换句话说,声明指针a的时候,可以告诉编译器,a所指向的变量是几维的数组,但是不能告诉编译器,a所指向的数组是大小是100×100的。

第3行换成以下语句是非法的

!//非法的代码
integer, pointer :: a()

编译器错误提示是“ ALLOCATABLE or POINTER attribute dictates a deferred-shape-array.” 即声明变量时,allocatable或pointer的属性表明数组为假定形状数组。如果此时声明上述语句(即给了数组的大小),那显然矛盾。

总结

  • 在Fortran中,指针可以指向一个数组或者一个数组中的一部分,但指针不能同时表示多个数组。
  • 数组是若干相同类型元素的集合,但数组的元素不能是指针。
  • 如果想实现一个数组,且数组的元素具有指针的功能,可以定义一个结构体类型的数组。

附录代码:

 program test
implicit none
integer i,j,k
real,allocatable,target :: work(:,:) type qcontainer
real,pointer :: obj(:)
end type qcontainer type(qcontainer),allocatable :: qtwork(:) ,qtemp allocate(work(,))
allocate(qtwork()) !//初始化
do j=,
do i=,
work(i,j)=i*j***
end do
end do !//指针变量赋值
do j=,
qtwork(j)%obj => work(:,j)
end do !//打印输入数组
print*,"input array: "
do j=,
print*,work(:,j)
end do !//打印指向的数组
print*,"point array: "
do j=,
print*,qtwork(j)%obj
end do !//置换
print*,"swap"
qtemp = qtwork()
do j=,
qtwork(j) = qtwork(j+)
end do
qtwork()=qtemp !//输出置换结果
do j=,
print*,qtwork(j)%obj
end do deallocate(work) end program

输出结果:

 input array:
7.000000 14.00000
28.00000 56.00000
63.00000 126.0000
point array:
7.000000 14.00000
28.00000 56.00000
63.00000 126.0000
swap
28.00000 56.00000
63.00000 126.0000
7.000000 14.00000
Press any key to continue . . .

Fortran的数组与指针的更多相关文章

  1. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  2. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  3. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  4. C指针-数组和指针的归一

    int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...

  5. 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

    数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...

  6. (C语言)数组与指针的区别

    以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...

  7. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

  8. 【C语言学习】《C Primer Plus》第10章 数组和指针

    学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...

  9. C语言学习004:数组与指针

    在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的

随机推荐

  1. September 17th 2017 Week 38th Sunday

    Distance could make you forget about them, but the memories would always be there. 距离会让你遗忘,但是回忆却始终在那 ...

  2. SOA面向服务架构——SOA的概念

    SOA的概念是Gartner 在1996年提出来的,并于2002年12月进一步提出SOA是“现代应用开发领域最重要的课题”.   一.SOA的定义 SOA分为广义的SOA和狭义的SOA,广义的SOA是 ...

  3. Linux 上安装MyEclipse

    操作系统ubuntu14.04,亲测安装MyEclipse2014成功,且破解成阿功.在安装myeclipse之前,您当然需要安装jdk了,jdk在这里不做介绍 下载 下载linux版本的MyEcli ...

  4. 智能家居中的物联网网关的可信计算平台模块(TPM)设计

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/BlueCloudMatrix/article/details/24184461 摘要: 随着智能家居 ...

  5. head头的设计:rfcn light-head rfcn

    faster缺点:1.不是全卷积,roi出来后是两个fc层,这样会丧失平移变性.   2.每个roi都要单独经过两个fc层,也就是分别进行分类和回归,耗时 也有种说法是roi-pooling后导致平移 ...

  6. Vue滚动加载自定义指令

    用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动 ...

  7. PAT02-线性结构3 Reversing Linked List

    题目:https://pintia.cn/problem-sets/1010070491934568448/problems/1037889290772254722 先是看了牛客(https://ww ...

  8. Android的JNI调用(三)

    注册JNI函数 注册之意就是将Java层的native函数与JNI层对应的实现函数关联起来,这样在调用Java层的native函数时,就能顺利转到JNI层对应的函数执行. (1)静态注册 根据函数名来 ...

  9. 1.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——运行终端

    终端是个允许我们运行命令行的程序,运行命令前,先打开它.在MacOS系统上,可以使用macOS应用 Spotlight来打开终端窗口,Spotlight也有其他两种方式触发,一种是键入⌘␣(comma ...

  10. springboot mybatis 后台框架平台 shiro 权限 集成代码生成器

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.servic ...