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