How Fortran 95/90 array pointers and arrays are passed is affected by the ATTRIBUTES properties in effect, and by the INTERFACE, if any, of the procedure they are passed to.
If the INTERFACE declares the array pointer or array with deferred shape (for example, ARRAY(:)), its descriptor is passed. This is true for array pointers and all arrays, not just allocatable arrays. If the INTERFACE declares the array pointer or array with fixed shape, or if there is no interface, the array pointer or array is passed by base address as a contiguous array, which is like passing the first element of an array for contiguous array slices.
When a Fortran 95/90 array pointer or array is passed to another language, either its descriptor or its base address can be passed.
The following shows how allocatable arrays and Fortran 95/90 array pointers are passed with different attributes in effect:
If the property of the array pointer or array is not included or is REFERENCE, it is passed by descriptor, regardless of the property of the passing procedure (None; C; or C, REFERENCE).
If the property of the array pointer or array is VALUE, an error is returned, regardless of the property of the passing procedure.
Note that the VALUE option cannot be used with descriptor-based arrays.
When you pass a Fortran array pointer or an array by descriptor to a non-Fortran routine, that routine needs to know how to interpret the descriptor. Part of the descriptor is a pointer to address space, as a C pointer, and part of it is a description of the pointer or array properties, such as its rank, stride, and bounds.
For information about the Intel Fortran array descriptor format, see Handling Arrays and Fortran Array Descriptors.
Fortran 95/90 pointers that point to scalar data contain the address of the data and are not passed by descriptor.