Search code examples
c++arrayscpointers

Difference between pointer to an array and pointer to the first element of an array


int (*arr)[5] means arr is a pointer-to-an-array of 5 integers. Now what exactly is this pointer?

Is it the same if I declare int arr[5] where arr is the pointer to the first element?

Is arr from both the examples are the same? If not, then what exactly is a pointer-to-an-array?


Solution

  • At runtime, a pointer is a "just a pointer" regardless of what it points to, the difference is a semantic one; pointer-to-array conveys a different meaning (to the compiler) compared with pointer-to-element

    When dealing with a pointer-to-array, you are pointing to an array of a specified size - and the compiler will ensure that you can only point-to an array of that size.

    i.e. this code will compile

    int theArray[5];
    int (*ptrToArray)[5];
    ptrToArray = &theArray;    // OK
    

    but this will break:

    int anotherArray[10];
    int (*ptrToArray)[5];
    ptrToArray = &anotherArray;    // ERROR!
    

    When dealing with a pointer-to-element, you may point to any object in memory with a matching type. (It doesn't necessarily even need to be in an array; the compiler will not make any assumptions or restrict you in any way)

    i.e.

    int theArray[5];
    int* ptrToElement = &theArray[0];  // OK - Pointer-to element 0
    

    and..

    int anotherArray[10];
    int* ptrToElement = &anotherArray[0];   // Also OK!
    

    In summary, the data type int* does not imply any knowledge of an array, however the data type int (*)[5] implies an array, which must contain exactly 5 elements.