Fortran的数组与指针
个人理解,欢迎指正
指针就是记录数据的内存地址的变量。指针可以指向单个变量,也可以指向数组。
数组是一个概念,是若干个类型相同的元素的有序集合。在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的数组与指针的更多相关文章
- 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- 《征服 C 指针》摘录3:数组 与 指针
一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...
- C指针-数组和指针的归一
int bArr[] = {1,2,3}; int *iarr = bArr; *iarr = 6; printf("%d\n",*iarr); printf("%d\n ...
- 《C专家编程》第四章——令人震惊的事实:数组和指针并不相同
数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明 ...
- (C语言)数组与指针的区别
以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...
- C语言教学--二维数组和指针的理解
对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...
- 【C语言学习】《C Primer Plus》第10章 数组和指针
学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
随机推荐
- DevExpress02、RibbonControl
RibbonControl 常用操作 1.如何代码显示选中的页 ribbonControl1.SelectedPage = ribbonPage2; 2.如何绑定ApplicationMenus和Po ...
- struts返回json数据
想要在struts中返回json格式数据有两种办法. 1.使用servlet的输出流 实际上就是在struts中获取response对象的输出流.然后写入你要返回的json数据,本质和用servlet ...
- python第十三课——嵌套循环
2.嵌套循环: 概念:循环中再定义循环,称为嵌套循环: [注意]嵌套循环可能有多层,但是一般我们实际开发最多两层就可以搞定了(99%的情况) 格式: 1).while中套while常用 2).whil ...
- HashMap,LinkedHashMap和Hashtable类的深入剖析与理解
上一篇文章写了一些关于HashMap以及HashMap的线程安全问题,这篇文章再来说说Map系列中HashMap,LinkedHashMap和Hashtable三者之间的差异以及该注意的地方. Has ...
- 「GXOI / GZOI2019」与或和
题目 广西和贵州的省选?好像很神仙的样子啊 之后发现这是一道水题 我们显然应该拆位考虑 显然我们应该对于每一位都拆一下看看这一位是\(0/1\) 显然我们如果找到一个全是\(1\)的矩阵,那么这一位的 ...
- 【转】JS实现继承的几种方式
既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; / ...
- 利用Zookeeper实现分布式锁及服务注册中心
对于Zookeeper的定义以及原理,网上已经有很多的优秀文章对其进行了详细的介绍,所以本文不再进行这方面的阐述. 本文主要介绍一些基本的准备工作以及zookeeper.net的使用. 本文源代码gi ...
- tp5简要
1.实例化模型 namespace app\web\controller; use think\Controller; use app\web\model\Member; use think\Load ...
- Jmeter之post上传文件
上周五东西都收拾好了,然后被叫住加班,直接搞到凌晨一两点,原因是另一个项目的性能出了点问题.为此我抓包写了一下主业务流的接口,涉及到文件上传,记录一下吧. 一.创建线程组,添加各类组件 这个就不用说了 ...
- HDU 1950(LIS)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1950 Bridging signals Time Limit: 5000/1000 MS (Java ...