首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型声明的Fortran指针属性

类型声明的Fortran指针属性
EN

Stack Overflow用户
提问于 2018-12-14 11:41:07
回答 1查看 643关注 0票数 2

我有以下类型

代码语言:javascript
复制
  type OCTREE_TYPE
     real                          :: box(2,3)
     integer, allocatable          :: icells(:)
     integer                       :: num_point
     integer                       :: depth
     type(OCTREE_TYPE), pointer    :: parent      => NULL()
     type(OCTREE_TYPE), pointer    :: children(:) => NULL()
  end type OCTREE_TYPE

现在,当我声明这个数据类型的变量时,这个声明的区别是什么?

代码语言:javascript
复制
   type(OCTREE_TYPE),pointer        :: octree_node

还有这个

代码语言:javascript
复制
  type(OCTREE_TYPE)        :: octree_node

此外,其中一个是指针,另一个不是。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-14 19:05:02

有什么区别(.)此外,其中一个是指针,另一个不是。

呃..。实际上,这是它们之间唯一的区别:一个是指针变量,另一个是正常变量。任何其他的区别都源于这样的事实。如果您已经对Fortran中的指针变量的工作方式感到满意,这个答案就在这里结束。如果你不是,这里有一个简短的描述。

Fortran中的变量被命名为对内存中包含值的地址的引用,这些地址在类型和特征上符合变量声明中的类型和特征。当您操作一个变量时,它在存储中的相应值将被获取或更新。

对于正态变量,这种关系是固定的。系统在可能使用之前为其值(及其所有组件,派生类型)分配连续存储,并根据自己的标准,在不再使用时释放该存储。同时,该变量总是引用内存中的相同地址,该地址在位置和大小上是固定的。

另一方面,对于pointer变量,这种关系是动态的。系统不会自动为其基础值分配任何存储空间,指针所占用的唯一空间是一个整数变量,该变量将满足当前所指向的地址。您有两种使用它的方法:

1)可以指示另一个变量,并使指针引用内存中的地址与其他变量引用的地址相同。这称为指针关联,并使指针变量作为该其他变量的别名。与其他语言不同的是,Fortran中的指针是打印出来的,这是非常棒的。您将只能将指针关联到在类型、种类和级别上与其一致的变量,如果它被标记为target属性(或者也是指针)。您可以随时更改指针的目标。

2)您可以要求系统使用allocate语句在内存中为该变量分配一个新的存储空间。这是理想的,当您想要控制什么时候存储将被分配或解除分配,并使它适合您的程序需要。此外,您还可以推迟要在运行时决定的变量的详细信息,例如数组的大小/边界或参数类型的len参数。请注意,当您选择这种方式时, you 负责管理它的内存。如果您更改了对另一个地址的引用而不释放前一个地址,则可能没有其他对该内存的引用,您或系统也将能够释放它,并且会发生内存泄漏。

因此,总结并回答:使用pointer属性,您可以使用该变量指向和操作其他变量,而不需要内存分配,acd会根据您的需要更改目标或您可以手动管理该变量的内存,将其大小、边界和长度推迟到运行时。

说到这里,我必须提醒你们注意灵活性给你们带来的妥协。在处理指针时有许多问题和微妙之处,例如内存泄漏、悬空指针、访问冲突、别名.可能会导致错误或性能损失。如果对指针唯一需要的是动态内存分配部分,并且不打算更改其目标,则应该使用allocatable属性。可分配变量和组件也有动态内存,但系统将为您管理解除分配,尽管您也可以手动deallocate

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53779081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档