Sandip Sandip - 1 year ago 56
C Question

Difference between "pointer to int" and "pointer to array of ints"

int main()
int (*x)[5]; //pointer to an array of integers
int y[6] = {1,2,3,4,5,6}; //array of integers
int *z; //pointer to integer

z = y;
for(int i=0;i<6;i++)
printf("%d ",z[i]);

x = y;
for(int i=0;i<6;i++)
printf("%d ",(*x)[i]);

return 0;

Both the above printfs print numbers 1 through 6.

If both "pointer to array of integers" and "pointer to integer" can do the same thing, do they have the same internal representation?

EDIT: This code does give warnings when compiled as pointed out by the answers below, however it does print the values correctly both the time on my x86_64 machine using gcc

Answer Source

Firstly, your code will not compile. The array has type int[6] (6 elements), while the pointer has type int (*)[5]. You can't make this pointer to point to that array because the types are different.

Secondly, when you initialize (assign to) such a pointer, you have to use the & on the array: x = &y, not just a plain x = y as in your code.

I assume that you simply typed the code up, instead of copy-pasting the real code.

Thirdly, about the internal representation. Generally, in practice, you should expect all data pointers to use the same internal representation. Moreover, after the above assignments (if written correctly), the pointers will have the same numerical value. The difference between int (*)[5] and int * exists only on the conceptual level, i.e. at the level of the language: the types are different. It has some consequences. For example, if you increment your z it will jump to the next member of the array, but if you increment y, it will jump over the whole array etc. So, these pointers do not really "do the same thing".