int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
output:
0045FB88 0045FB88
0045FB88 0045FB7C
The output for u
makes sense.
I understand that t
and &t[0]
should have the same value, but how come &t
is also the same? What does &t actually mean?
When t
is used on its own in the expression, an array-to-pointer conversion takes place, this produces a pointer to the first element of the array.
When t
is used as the argument of the &
operator, no such conversion takes place. The &
then explicitly takes the address of t
(the array). &t
is a pointer to the array as a whole.
The first element of the array is at the same position in memory as the start of the whole array, and so these two pointers have the same value.
Actual type of t
is int[10]
, so &t
is the address of array.
Also, int[]
implicitly converts to int*
, so t
converts to address of array the first element of array.
There is no variable called t
, since you can't change it. The name t
simply refers to the address of the first element (and also has a size associated with it). Thus, taking the address of the address doesn't really make sense, and C "collapses" it into just being the address.
The same sort of thing happens for the case of functions:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
This should print the same thing, since there is no variable holding the address of foo
, whose address in turn can be taken.