# Pointers

For interoperating with C pointers, the module ISO_C_BINDING contains the derived types C_PTR and C_FUNPTR, which are interoperable with C object and function type pointers, respectively.

These types, as well as certain procedures in the module, provide the mechanism for passing dynamic arrays between the two languages. Because its elements do not need to be contiguous in memory, a Fortran pointer target or assumed-shape array cannot be passed to C. However, you can pass an allocated allocatable array to C, and you can associate an array allocated in C with a Fortran pointer. Additionally, as shown in the following, you can convert a pointer in C format to one in Fortran format.

Fortran Program Example
    program demo_c_f_pointer
           use, intrinsic :: iso_c_binding
           implicit none

           interface
             function make_array(n_elements) bind(C)
               import ! Make iso_c_binding visible here
               type(C_PTR) :: make_array
               integer(C_INT), value, intent(IN) :: n_elements
             end function make_array
           end interface

           type(C_PTR) :: cptr_to_array
           integer(C_INT), pointer :: array(:) => NULL()
           integer, parameter :: n_elements = 3 ! Number of elements

           ! Call C function to create and populate an array
           cptr_to_array = make_array(n_elements)
           ! Convert to Fortran pointer to array of n_elements elements
           call C_F_POINTER (cptr_to_array, array, [n_elements])
           ! Print value
           print *, array

    end program demo_c_f_pointer

C Module Example
    #include <stdlib.h>
    int  *make_array(int n_elements) {
               int *parray;
               int i;
    	parray = (int*) malloc(n_elements * sizeof(int));
    	for (i = 0; i < n_elements; i++) {
    		parray[i] = i+1;
    	}
    	return parray;
     }

Parent topic: Data Types