c - Why "*(&arr+4)" is different then "&arr[4]"? -
int arr[] = { 0, 1, 2, 3, 4, 5 }; i performing address operation tests, increase understanding of ref , deref. here lot of confusion.
i found out &*(arr+4) uses same address &arr[4]but never met such assignment &*
also figured *(&arr+4) uses same address &arr+4 doesn't make sense me.
i couldn't find info that, ask here, why *(&arr+4) uses same address &arr+4 , why *(&arr+4) different &arr[4]?
arr array:
arr: int[6] [0|1|2|3|4|5] when used in expression other sizeof arr or &arr, array decays pointer first element of array:
(arr+0): int * [*] | v [0|1|2|3|4|5] when integral value added pointer, pointer address (sizeof (t)) * n bytes later in memory (where t type pointed pointer, , n integral value added pointer):
(arr+4): int * [*] | v [0|1|2|3|4|5] when pointer dereferenced, value pointed to:
*(arr+4): int 4 /* specifically, 4 in fifth position in `arr` */ [0|1|2|3|[4]|5] when address taken of int, pointer points int:
&*(arr+4): int * [*] /* notice, same (arr+4) */ | v [0|1|2|3|4|5] array indexing equivalent pointer-addition followed dereferencing:
arr[4] == *(arr+4) /* see above definition of *(arr+4) */ so yes... &*(arr+4) , &arr[4] equivalent.
when address of array taken, pointer array:
&arr: int (*)[6] [*] /* points array whole, not first element of array */ | v [0|1|2|3|4|5] when increment pointer, same rules apply above:
&arr + 4: int(*)[6] /*points memory that*/ [*] /* isn't part of array... */ | /* undefined behaviour */ v [0|1|2|3|4|5][x|x|x|x|x|x][x|x|x|x|x|x][x|x|x|x|x|x][x|x|x|x|x|x] since has undefined behaviour, can't reason without reference underlying machine architecture , compiler implementation.
if imagine defined (as case if arr part of larger array)... can continue. dereferencing pointer array gives array again:
/*the 5th array in array of arrays*/ *(&arr+4): int[6] [0|1|2|3|4|5][x|x|x|x|x|x][x|x|x|x|x|x][x|x|x|x|x|x][[x|x|x|x|x|x]] you find *(&arr+4) , (&arr+4) have same address, since *(&arr+4) decays pointer first element of *(&arr+4), , array starts @ first element, pointer start of array , pointer first element of array identical.
*(&arr+4) different &arr[4] since refers different thing (see above).
Comments
Post a Comment