I have been learning C for couple of months and I came across a question which is given below.
#include <stdio.h> int main() { int a[2][2] = {{1,2}, {3,4}}; int (**p)[2] = &a; for (int i=0; i<2; ++i) { for (int j=0; j<2; ++j) { printf("%d %u\n", a[i][j], (*(a+i) + j)); } } for (int i=0; i<4; ++i) { printf("%d %u\n", *(*p + i), (*p + i)); } printf("%u\n", p); printf("%u\n", p+1); printf("%u\n", p+2); printf("%u\n", p+3); printf("%u\n", *p); printf("%u\n", *p+1); printf("%u\n", *p+2); printf("%u\n", *p+3); puts(""); } The output that I am getting on my machine is as follows:
1 3751802992 2 3751802996 3 3751803000 4 3751803004 1 1 9 9 17 17 25 25 3751802992 3751803000 3751803008 3751803016 1 9 17 25 I understand the first four lines of the output where the elements of the 2D array and their respective addresses is getting printed but I have absolutely no clue how the other outputs are happening.
I checked in an online IDE and there also I am getting the same output except the addresses which obviously will differ. I know that int (**p)[2] is incomparable pointer type to a[2][2] which is a (int *)[2] data type. But still I want to understand how the p pointer is working.
Can someone please help me understand how this is happening? I have been eagerly waiting to get the logic behind the code outputs. I am extremely sorry for the long code snippet and the long output sequence. Thanks in advance.
N.B - I know that the code is producing a lot of warnings but I want to get the core idea about p.
int (**p)[2] = &a;it goes off the rails. Everything after that is pure nonsense. You have an array ofint[2][2], not an array ofint*. Interpreting integers as actual pointers is asking for trouble.