let int *p = &i;
what it means, address of the integer i is stored in the p. ===> value of p = address of i.
∴ if you use p to require value, then it gives the address of the integer i.
ARR is a two dimensional array.
therefore it is a collection of 1-D array's. when you specified as value of ARR then it returns the base address of 1-D array.
for clarity image https://drive.google.com/open?id=1xGGZKaGH582n_aqwWOgyeGssxpYdjuRB
Note that, *(*(p+i)+j) = p[i][j]; and *(*(p+j)+i) = p[j][i];
when i=0
when j=0 ===> the printf function prints 1,1,1,1
when j=1 ===> the printf function prints 2,2,2,2
when j=2 ===> the printf function prints 3,3,3,3
when i=1
when j=0 ===> the printf function prints 2,2,2,2
when j=1 ===> the printf function prints 3,3,3,3
when j=2 ===> the printf function prints 4,4,4,4