POINTER和ALLOCATABLE之间的区别

Ste*_*ini 5 fortran fortran90

这两个代码之间有什么区别

type Foo
   real, allocatable :: bar(:)
end type
Run Code Online (Sandbox Code Playgroud)

type Foo
   real, pointer :: bar(:)
end type
Run Code Online (Sandbox Code Playgroud)

特别是当涉及到以下代码时:

type(Foo) :: myfoo
allocate(myfoo%bar(10))
Run Code Online (Sandbox Code Playgroud)

Wil*_*cat 10

我认为在这种情况下没有任何主要差异.

通常,ALLOCATABLE数组更有效.但在Fortran 90/95中,POINTER阵列更灵活.例如,无法使用ALLOCATABLE数组作为派生类型的组件.Fortran 2003解决了这个问题.所以尽可能使用ALLOCATABLE数组.

编辑

只想提及程序在尝试分配已分配实体时的行为的显着差异.如果实体是ALLOCATABLE,您将收到运行时错误.该程序

PROGRAM main

  IMPLICIT NONE

  TYPE :: foo
    REAL, DIMENSION(:), ALLOCATABLE :: bar
  END TYPE foo

  TYPE(foo) :: my_foo

  ALLOCATE (my_foo%bar(10))
  ALLOCATE (my_foo%bar(10))

END PROGRAM main
Run Code Online (Sandbox Code Playgroud)

使用gfortran编译导致此类错误消息:

Fortran runtime error: Attempting to allocate already allocated variable 'my_foo'
Run Code Online (Sandbox Code Playgroud)

相比之下,您可以使用POINTER进行此类操作.