Copyright Digital Equipment Corp. All rights reserved.

HP_Fortran_POINTER

 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.