int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
输出:
0045FB88 0045FB88
0045FB88 0045FB7C
u
的输出是有意义的。
我理解t
和&t[0]
应该具有相同的值,但是为什么&t
也相同呢?&t实际上是什么意思?
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
是指向整个数组的指针。u
是一个指针。 - quuxbazerspan<const int, 3>
,因此两侧都没有转换为指针,这个事实非常有用。 - Johannes Schaub - litbt
的实际类型是int[10]
,因此&t
是数组的地址。
另外,int[]
隐式转换为int*
,因此t
会转换为数组第一个元素的地址。
没有名为t
的变量,因为您无法更改它。名称t
仅指向第一个元素的地址(并且还有与之关联的大小)。因此,获取地址的地址实际上没有意义,C语言将其“折叠”为只是地址。
对于函数的情况,发生了同样的事情:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
这应该打印相同的内容,因为没有变量保存foo
的地址,而其地址可以被获取。
t
的变量。您可以将其传递给接受类型为int(&)[10]
的参数的函数。 - Abyx
t
转换为指针和&t
之间唯一的区别是指针类型。后者所引用的形式上是数组类型,因此将其加1会使它在内存中移动相当大的距离(到下一个这样的数组)。而前者的引用类型是元素类型。术语:在[comp.lang.c++] Usenet组中,关于像您的u
这样的指针是否可以被视为“指向”数组存在一些争议,因为其引用不是数组类型。这已经通过指向标准使用这种措辞解决了无数次。祝好 & hth. - Cheers and hth. - Alf