为什么数组的地址与转换为指针的数组相同?

问题描述 投票:0回答:3
int t[10];

int * u = t;

cout << t << " " << &t << endl;

cout << u << " " << &u << endl;

输出:

0045FB88 0045FB88
0045FB88 0045FB7C

u
的输出是有意义的。

我明白

t
&t[0]
应该具有相同的值,但是为什么
&t
也相同? &t 实际上是什么意思?

c++ arrays pointers memory-address
3个回答
43
投票

t
在表达式中单独使用时,会发生数组到指针的转换,这会生成指向数组第一个元素的指针。

t
用作
&
运算符的参数时,不会发生此类转换。然后
&
显式获取
t
(数组)的地址。
&t
是指向整个数组的指针。

数组的第一个元素在内存中与整个数组的开头位于同一位置,因此这两个指针具有相同的值。


5
投票

t
的实际类型是
int[10]
,所以
&t
是数组的地址。

此外,

int[]
隐式转换为
int*
,因此
t
转换为数组第一个元素的地址。


-4
投票

没有名为

t
的变量,因为您无法更改它。名称
t
只是指第一个元素的地址(并且还有与其关联的大小)。因此,获取地址的地址实际上没有意义,C 将其“折叠”为地址。

函数的情况也会发生同样的事情:

int foo(void)
{
  return 12;
}

printf("%p and %p\n", (void *) foo, (void *) &foo);

这应该打印相同的内容,因为没有变量保存

foo
的地址,而可以依次获取其地址。

© www.soinside.com 2019 - 2024. All rights reserved.