4

有人可以为我解释这个小代码片段吗?

鉴于:

int a[3] = {2,3,4};

为什么以下评估为真?

static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?

这就是说address of a的一样a吗?如果是这样,为什么这是真的?

4

3 回答 3

4

这是因为变量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++中ax两者都称为聚合(请参阅我的回答:什么是聚合?

于 2013-02-20T05:00:15.077 回答
1

在几乎所有情况下,数组的名称都会衰减为指向数组第一个元素的指针。所以在 中static_cast<void*>(a)a衰变为&a[0]; 它的类型是“指向 int 的指针”。该表达式的计算结果为数组第一个元素的地址。然而static_cast<void*>(&a)&a在 中是数组本身的地址;它的类型是“指向 3 个 int 数组的指针”。这就是这里需要强制转换的原因:没有强制转换的两个表达式将具有不同的类型,并且无法进行比较。两者都可以转换void*和比较。所以这段代码说明的是数组的第一个元素的地址与数组的地址相同,前面没有填充。

于 2013-02-20T14:26:32.523 回答
0

数组的名称通常计算为数组第一个元素的地址,因此数组和 &array 具有完全相同的值。

但是,它们是不同的类型。对于以下数组:

int a[8];

a+1 是数组 a + sizeof(int) 的地址,但 &a+1 将是数组 a + 8 * sizeof(int) 的地址。

于 2013-02-20T05:10:59.253 回答