c - 3d array print address after deference twice? -
why 3d array print address after being dereferenced twice? please me understand code posted below, (assume array begins @ location 1002).
int main() { int a[2][3][4]={ { 1,2,3,4, 4,5,6,7, 9,1,1,2 }, { 2,1,4,7, 6,7,8,9, 0,0,0,0 } }; printf("%u %u %u %u\n",a,*a,**a,***a); //a == *a == **a, print address 1002. why?
}
**a
has type int *
, points first int
in 3d array
*a
has type int (*)[4]
, points first row of 3d array
a
has type int (*)[3][4]
, points first 2d array in 3d array
&a
has type int (*)[2][3][4]
, points whole 3d array
so pointers point same address. it's type of pointer different. following code may illustrate point.
int main( void ) { int a[2][3][4]={ 1,2,3,4, 4,5,6,7, 9,1,1,2, 2,1,4,7, 6,7,8,9, 0,0,0,0 }; int *ptrint; // pointer int int (*ptrarray1)[4]; // pointer array of ints int (*ptrarray2)[3][4]; // pointer 2d array of ints int (*ptrarray3)[2][3][4]; // pointer 3d array of ints ptrint = **a; ptrarray1 = *a; ptrarray2 = a; ptrarray3 = &a; printf( "%p %p\n", ptrint , ptrint + 1 ); printf( "%p %p\n", ptrarray1, ptrarray1 + 1 ); printf( "%p %p\n", ptrarray2, ptrarray2 + 1 ); printf( "%p %p\n", ptrarray3, ptrarray3 + 1 ); }
note: left out inner braces in array initialization demonstrate inner braces optional. best practice have of inner braces.
typical output code shown below. i've added comments show difference between 2 pointers decimal number.
0x17b00 0x17b04 // 4 bytes, hence pointer int 0x17b00 0x17b10 // 16 bytes, pointer int[4] 0x17b00 0x17b30 // 48 bytes, pointer int[3][4] 0x17b00 0x17b60 // 96 bytes, pointer int[2][3][4]
note when add 1 pointer, size of object added pointer. example, if have int *
, add 1
pointer, value of pointer increase 4 because sizeof(int) == 4
. (yes, assumes ints 32-bits, thank you.)
so adding 1 pointer, can determine size of object pointer points to. gives clue type of pointer compiler's point of view. in example above, notice adding 1 ptrarray1
changes pointer 16. that's because ptrarray1
points object of size 16, points array of 4 ints.
just we're confused, allow me following line of code print number 8
. chose 8 since appears once in array, can tell it's coming from.
printf( "%d\n", ptrarray3[0][1][1][2]);
notice appears i'm using ptrarray3
4-dimensional array. why pointers multidimensional arrays confusing in c. when convert array pointer, pointer has 1 less dimension array. when use pointer array syntax, use though had 1 more dimension.
so example, start 2d array
int array[4][100];
the corresponding pointer pointer 1d array
int (*ptr)[100] = array;
but can use pointer 2d array
ptr[2][100] = 6;
that basis of confusion, , reason pointer-to-array seldom used feature in c.
Comments
Post a Comment