This POINTER statement (formerly the Compaq Fortran POINTER
statement) is different from the Fortran 95/90 POINTER statement.
This POINTER statement establishes pairs of variables and pointers,
in which each pointer contains the address of its paired variable.
Statement format:
POINTER ((pointer,pointee) [,(pointer,pointee)]...
pointer Is a variable whose value is used as the
address of the pointee.
pointee Is a variable, array, array declarator, record
structure, record array, or record array
specification.
The following are rules and behavior for the "pointer" argument:
o Two pointers can have the same value, so pointer aliasing is
allowed.
o When used directly, a pointer is treated like an integer
variable. A pointer occupies two numeric storage units, so it
is a 64-bit quantity (INTEGER*8).
o A pointer cannot be a pointee.
o A pointer cannot appear in an ASSIGN statement and cannot have
the following attributes:
ALLOCATABLE PARAMETER
EXTERNAL POINTER
INTRINSIC TARGET
A pointer can appear in a DATA statement with integer literals
only.
o Integers can be converted to pointers, so you can point to
absolute memory locations.
o A pointer variable cannot be declared to have any other data
type.
o A pointer cannot be a function return value.
o You can give values to pointers by doing the following:
- Retrieve addresses by using the LOC intrinsic function (or
%LOC built-in function)
- Allocate storage for an object by using the MALLOC
intrinsic function or LIB$GET_VM
For example:
Using %LOC: Using MALLOC:
integer i(10) integer i(10)
integer i1 (10) /10*10/ pointer (p,i)
pointer (p,i) p = malloc (40)
p = %loc (i1) i(2) = i(2) + 1
i(2) = i(2) + 1
Using LIB$GET_VM:
INTEGER I(10)
INTEGER LIB$GET_VM, STATUS
POINTER (P,I)
STATUS = LIB$GET_VM(P,40)
IF (.NOT. STATUS) CALL EXIT(STATUS)
I(2) = I(2) + 1
The value in a pointer is used as the pointee's base
address.
The following are rules and behavior for the "pointee" argument:
o A pointee is not allocated any storage. References to a
pointee look to the current contents of its associated pointer
to find the pointee's base address.
o A pointee can appear in only one POINTER statement.
o A pointee array can have fixed, adjustable, or assumed
dimensions.
o A pointee cannot appear in a COMMON, DATA, EQUIVALENCE, or
NAMELIST statement and cannot have the following attributes:
ALLOCATABLE POINTER
AUTOMATIC SAVE
INTENT STATIC
OPTIONAL TARGET
PARAMETER
o A pointee cannot be a dummy argument.
o A pointee cannot be a function return value.
o A pointee cannot be a record field or an array element.
o A pointee cannot be zero-sized.
o A pointee cannot be an automatic object.
o A pointee cannot be the name of a generic interface block.
o If a pointee is of derived type, it must be of sequence type.