Please see the following code snippet:
int main()
{
int arr[] = { 0,3 , 4,28,1198};
for(int i=0;i<5;i++)
printf("\n arr[i] %u \n" , arr+i);
printf("\n *******************\n");
printf("%u ", &arr+1);
return 1;
}
When it is run, it outputs:
arr[i] 3219650892
arr[i] 3219650896
arr[i] 3219650900
arr[i] 3219650904
arr[i] 3219650908
*******************
3219650912
It seems that it is showing me the last element's address added with 1 more integer which seems to be strange. I feel it should have given me address of second element.
Can you help me understand this behavior?
To understand this, compare the meaning of arr
with &arr
.
arr
is the name for the array. C has a rule that an array expression is converted to a pointer to the first element (except in some particular situations that do not apply here). So arr
is converted to &arr[0]
, which is the address of the first element. This is a pointer to int
, so, when you add 1 to it, you get a pointer to the next int
. Thus, successive increments to this pointer increment through elements of the array.
In contrast, &arr
is a pointer to the array.* The starting address of the array and the starting address of the first element are the same, but they have different types. The type of &arr
is ”pointer to array of five int”. When you add 1 to this, you get a pointer to the next array of five int. That is, the address is incremented by the size of an entire array of five int.
Incidentally, it is inappropriate to use a %u
specifier to print addresses. You should use %p
and convert the addresses to void *
, such as:
printf("%p ", (void *) (&arr+1));
Footnote
* This is one of those special situations: When an array is used with &
, the conversion is not done. In &arr
, arr
is the array, not a pointer, and &arr
is its address.
&arr+1
&arr
is a pointer to the array arr
, so &arr + 1
points at the address of the last element of arr
array + 1
element. That is arr
last element address is &arr[4]
so &arr + 1
is the same address as &arr[5]
(but the type is different).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With