我有以下类型
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
除了其中一个是指针而另一个不是。
答案 0 :(得分:1)
区别(...)区别在于,其中一个是指针,另一个不是。
Err ...实际上,这是它们之间的唯一区别:一个是指针变量,另一个是普通变量。任何其他区别都源于这样的事实。如果您已经对指针变量在Fortran中的工作方式已经满意,则此答案就此停止。如果情况并非如此,这里有一个简短说明。
Fortran中的变量被命名为对内存中地址的引用,该地址包含值,这些值的类型和特征与变量声明中的值一致。对变量进行操作时,将获取或更新其在存储中的对应值。
对于普通变量,此关系是固定的。系统会在其可能使用之前为其值(及其所有组件,对于派生类型)分配连续的存储,并根据其自身的标准在不再使用它们时释放该存储。同时,该变量始终引用内存中相同的地址,该地址的位置和大小固定。
另一方面,对于pointer
变量,此关系是动态的。系统不会自动为其基础值分配任何存储空间,指针占用的唯一空间是整数变量,它将占用其当前指向的地址。您有2种使用方式:
1)您可以指示另一个变量,并使您的指针引用的内存与其他变量引用的地址相同。这称为 pointer association ,它使您的指针变量可以用作其他变量的别名。与其他语言不同,Fortran中的指针被键入,这很棒。您将只能将指针与在类型,种类和等级上与其相符的变量相关联,并且也只能将其标记为target
属性(或也是指针)。您可以随时更改指针的目标。
2)您可以要求系统使用allocate
语句为此变量分配一个新的存储器存储空间。当您想控制何时分配或释放存储并使其适合程序需求时,这是理想的。另外,您可以推迟在运行时确定的变量的详细信息,例如数组的大小/边界或参数化类型的len
参数。请注意,当您选择这种方式时,您将负责其内存的管理。如果您在不取消分配前一个地址的情况下更改了对另一个地址的引用,则可能没有对该内存的其他引用,并且您或系统也将无法释放它,并且会发生内存泄漏。
因此,总结一下:通过pointer
属性,您可以使用此变量指向并操作其他变量,而无需分配内存,根据需要更改acd目标,或者可以管理内存手动设置此变量,将其大小,范围和长度推迟到运行时。
说,我必须提醒您灵活性指针带给您的妥协。在处理指针时,存在很多陷阱和微妙之处,例如内存泄漏,悬空指针,访问冲突,别名...,它们可能会产生错误或性能损失。如果您只希望指针是动态内存分配部分,并且不打算更改其目标,则应改用allocatable
属性。可分配的变量和组件也具有动态内存,但是系统也将为您管理释放,尽管您也可以手动deallocate
。