int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
输出:
0045FB88 0045FB88
0045FB88 0045FB7C
u
的输出是有意义的。
我明白
t
和&t[0]
应该具有相同的值,但是为什么&t
也相同? &t 实际上是什么意思?
当
t
在表达式中单独使用时,会发生数组到指针的转换,这会生成指向数组第一个元素的指针。
当
t
用作 &
运算符的参数时,不会发生此类转换。然后 &
显式获取 t
(数组)的地址。 &t
是指向整个数组的指针。
数组的第一个元素在内存中与整个数组的开头位于同一位置,因此这两个指针具有相同的值。
t
的实际类型是int[10]
,所以&t
是数组的地址。
此外,
int[]
隐式转换为int*
,因此t
转换为数组第一个元素的地址。
没有名为
t
的变量,因为您无法更改它。名称 t
只是指第一个元素的地址(并且还有与其关联的大小)。因此,获取地址的地址实际上没有意义,C 将其“折叠”为地址。
函数的情况也会发生同样的事情:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
这应该打印相同的内容,因为没有变量保存
foo
的地址,而可以依次获取其地址。