71GA
71GA

Reputation: 1401

Pointer to an entire array

I stumbled upon "pointer to the entire array" and wrote a test program to clear some things out:

#include <stdio.h>

int main(){

    int x[5] = {1, 2, 3, 4, 5};

    int  *a     =  x;   // points to the 1st array element
    int (*b)[5] = &x;   // points to the 1st addres of the stream of 5 int elements
    int (*c)[5] = x;    // points to the 1st addres of the stream of 5 int elements

    printf("%p\n%p\n%p\n\n",
        (void *)a,
        (void *)b,
        (void *)c
    );

    ++a;
    ++b;
    ++c;

    printf("%p\n%p\n%p\n\n",
        (void *)a,
        (void *)b,
        (void *)c
    );

    return 0;
}

This outputs:

0x7ffed0c20690
0x7ffed0c20690
0x7ffed0c20690

0x7ffed0c20694
0x7ffed0c206a4
0x7ffed0c206a4

To me it looks like lines:

    int (*b)[5] = &x;
    int (*c)[5] = x;

achieve exact same result, because:


Q1: Are there any hidden differences between definitions of *b and *c that I am missing?

Q2: Does pointer arithmetics only depends on the size of the pointer?


After you pointed I noticed that I do get an error:

main.c:9:16: warning: initialization of ‘int (*)[5]’ from incompatible pointer type ‘int *’ [-Wincompatible-pointer-types]
  int (*c)[5] = x; // points to the 1st array element

Upvotes: 1

Views: 230

Answers (1)

Inian
Inian

Reputation: 85800

Q1: Are there any hidden differences between definitions of *b and *c that I am missing?

Pointer arithmetic on these two pointers will remain the same. Because internally array decays into the pointer to the first element in it, i.e. arr[n] will be converted to an expression of type "pointer to arr", and its value will be the address of the first element in the array.

Q2: Does pointer arithmetics only depends on the size of the pointer?

No, it depends on the size of the underlying type pointed to. Even in your provided sample input ++a and ++b are yielding different results. Because ++a offsets pointer by sizeof(int) which is 4. But in case of ++b your pointer is incremented by size of 5 * sizeof(int) by 20 (decimal)

Upvotes: 3

Related Questions