比较两个指针

Compare two pointers

我最近遇到了如何在 Fortran 中比较两个指针的问题。在 C 中,可以将两个指针与 (pA == pB) 进行比较(pApB 是指针),因为它们只是地址。但在 Fortran 中,指针不仅仅是纯内存地址。代码 if(pa.ne.pb)papb 是同一类型的指针)给我一个错误

Operands of comparison operator '.ne.' at (1) are TYPE(sometype)/TYPE(sometype)

其中 sometype 是指针指向的类型。

有没有办法比较两个指针是否指向同一个目标?或者我是否必须为指向的类型创建一个 .ne.-operator?

因为 associated 内在函数可以部分完成您想要的操作:

if (.not.ASSOCIATED(pa, pb)) ...

在许多情况下,使用带有两个指针参数的 associated 会告诉您这两个目标是否 "occupy the same storage units"。从某种意义上说,当指针指向同一目标时就是这种情况。

integer, target :: a
integer, pointer :: pa, pb
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)

唉,事情没那么简单

标量目标的另一个限制是它们不是零大小的存储。拿下面的案例

type t
end type t

type(t), target :: a
type(t), pointer :: pa, pb
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)

如果类型为 t 的变量具有零大小存储,则其输出必须为 .FALSE.,即使它们肯定是相同的目标。 t 类型对象的存储大小是一个实现细节。

同样适用于大小为零的数组,尽管很明显这里的结果是 .FALSE.:

integer, target :: a(0)
integer, pointer :: pa(:), pb(:)
pa=>a; pb=>a

print*, ASSOCIATED(pa, pb)

如果您有您关心的第一种病理情况,则可能会考虑使用 C 地址和 Fortran 2003 C 互操作性。

c_associated函数比较由c_loc确定的C地址。继续上面的代码 type(t) 目标,

print*, C_ASSOCIATED(C_LOC(pa), C_LOC(pb))

可能更宽容。同样,它是否有效取决于实施。

这种使用 C 地址的方法在长度为零的字符串或大小为零的数组的情况下无济于事:在这些情况下禁止使用 c_loc

综上所述,一般情况下ASSOCIATED(pa, pb) returns .TRUE. 当且仅当 papb 指向同一个目标,但两个方向都有例外。

associated() 函数采用第二个可选指针参数。然后您可以测试两个指针是否与同一目标相关联:

if (associated(pA, pB)