有人可以为我解释这个小代码片段吗?
鉴于:
int a[3] = {2,3,4};
为什么以下评估为真?
static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?
这就是说address of a
的一样a
吗?如果是这样,为什么这是真的?
有人可以为我解释这个小代码片段吗?
鉴于:
int a[3] = {2,3,4};
为什么以下评估为真?
static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?
这就是说address of a
的一样a
吗?如果是这样,为什么这是真的?
这是因为变量a
的地址与数组的第一个元素的地址一致a
。当我们说“数组的第一个元素的地址”时,您也可以想到哪个a
更清楚)。&a[0]
另一个例子,
struct X
{
int i;
};
X x;
这里变量x
的地址也与x.i
(聚合的第一个元素)的地址一致,所以会打印1
:
std::cout << (&x == &(x.i)) << std::endl; //1
所以在你的情况下,&a
就像&x
,和a
(或&a[0]
)就像&(x.i)
。
请注意,在 C++中a
,x
两者都称为聚合(请参阅我的回答:什么是聚合?)
在几乎所有情况下,数组的名称都会衰减为指向数组第一个元素的指针。所以在 中static_cast<void*>(a)
,a
衰变为&a[0]
; 它的类型是“指向 int 的指针”。该表达式的计算结果为数组第一个元素的地址。然而static_cast<void*>(&a)
,&a
在 中是数组本身的地址;它的类型是“指向 3 个 int 数组的指针”。这就是这里需要强制转换的原因:没有强制转换的两个表达式将具有不同的类型,并且无法进行比较。两者都可以转换void*
和比较。所以这段代码说明的是数组的第一个元素的地址与数组的地址相同,即前面没有填充。
数组的名称通常计算为数组第一个元素的地址,因此数组和 &array 具有完全相同的值。
但是,它们是不同的类型。对于以下数组:
int a[8];
a+1 是数组 a + sizeof(int) 的地址,但 &a+1 将是数组 a + 8 * sizeof(int) 的地址。