Well, these are different things. arrsplits in most contexts into a pointer to the first element of your array - this means a pointer to the first 3-element row in your 2D array: enter int (*)[3]. arr + 1, then, points to the second line in the array.
&arris the address of the array itself (type int (*)[3][3]), so it &arr + 1points to memory just beyond the end of your entire 2D array.
, -. , , , . :
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
&arr+1 arr+1 . , :
36
12
36 : 3 ร 3 ร 4 = 36 . 12: 1 ร 3 ร 4 = 12 .
. , %d, . , %p .