我有以下类型
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现在,当我声明这个数据类型的变量时,这个声明的区别是什么?
type(OCTREE_TYPE),pointer :: octree_node还有这个
type(OCTREE_TYPE) :: octree_node此外,其中一个是指针,另一个不是。
发布于 2018-12-14 19:05:02
有什么区别(.)此外,其中一个是指针,另一个不是。
呃..。实际上,这是它们之间唯一的区别:一个是指针变量,另一个是正常变量。任何其他的区别都源于这样的事实。如果您已经对Fortran中的指针变量的工作方式感到满意,这个答案就在这里结束。如果你不是,这里有一个简短的描述。
Fortran中的变量被命名为对内存中包含值的地址的引用,这些地址在类型和特征上符合变量声明中的类型和特征。当您操作一个变量时,它在存储中的相应值将被获取或更新。
对于正态变量,这种关系是固定的。系统在可能使用之前为其值(及其所有组件,派生类型)分配连续存储,并根据自己的标准,在不再使用时释放该存储。同时,该变量总是引用内存中的相同地址,该地址在位置和大小上是固定的。
另一方面,对于pointer变量,这种关系是动态的。系统不会自动为其基础值分配任何存储空间,指针所占用的唯一空间是一个整数变量,该变量将满足当前所指向的地址。您有两种使用它的方法:
1)可以指示另一个变量,并使指针引用内存中的地址与其他变量引用的地址相同。这称为指针关联,并使指针变量作为该其他变量的别名。与其他语言不同的是,Fortran中的指针是打印出来的,这是非常棒的。您将只能将指针关联到在类型、种类和级别上与其一致的变量,如果它被标记为target属性(或者也是指针)。您可以随时更改指针的目标。
2)您可以要求系统使用allocate语句在内存中为该变量分配一个新的存储空间。这是理想的,当您想要控制什么时候存储将被分配或解除分配,并使它适合您的程序需要。此外,您还可以推迟要在运行时决定的变量的详细信息,例如数组的大小/边界或参数类型的len参数。请注意,当您选择这种方式时, you 负责管理它的内存。如果您更改了对另一个地址的引用而不释放前一个地址,则可能没有其他对该内存的引用,您或系统也将能够释放它,并且会发生内存泄漏。
因此,总结并回答:使用pointer属性,您可以使用该变量指向和操作其他变量,而不需要内存分配,acd会根据您的需要更改目标或您可以手动管理该变量的内存,将其大小、边界和长度推迟到运行时。
说到这里,我必须提醒你们注意灵活性给你们带来的妥协。在处理指针时有许多问题和微妙之处,例如内存泄漏、悬空指针、访问冲突、别名.可能会导致错误或性能损失。如果对指针唯一需要的是动态内存分配部分,并且不打算更改其目标,则应该使用allocatable属性。可分配变量和组件也有动态内存,但系统将为您管理解除分配,尽管您也可以手动deallocate。
https://stackoverflow.com/questions/53779081
复制相似问题