有人可以为我解释这个小代码片段吗?
假设:
int a[3] = {2,3,4};
为什么以下评估为真?
static_cast<void *>(a) == static_cast<void *>(&a); // Why is this true?
这是说address of a
与a
相同吗?如果是这样,为什么这是真的?
答案 0 :(得分: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 ++中,a
和x
都称为聚合(请参阅我的回答:What is an aggregate?)
答案 1 :(得分:1)
在几乎所有上下文中,数组的名称都会衰减为指向数组第一个元素的指针。因此,在static_cast<void*>(a)
中,a
衰变为&a[0]
;它的类型是“指向int的指针”。表达式计算结果的第一个元素的地址。但是,在static_cast<void*>(&a)
中,&a
是数组本身的地址;它的类型是“指向3 int数组的指针”。这就是为什么需要强制转换的原因:没有强制转换的两个表达式会有不同的类型,无法进行比较。两者都可以转换为void*
并进行比较。所以这段代码说明的是数组的第一个元素的地址与数组的地址相同,即,前面没有填充。
答案 2 :(得分:0)
数组的名称通常计算为数组的第一个元素的地址,因此数组和&amp;数组具有完全相同的值。
但是,它们是不同的类型。对于以下数组:
int a[8];
a + 1是数组的地址a + sizeof(int) 但是&amp; a + 1将是数组的地址a + 8 * sizeof(int)。