C ++ static_cast <void * =“”> </void>

时间:2013-02-20 04:58:23

标签: c++ static-cast

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

假设:

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

为什么以下评估为真?

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

这是说address of aa相同吗?如果是这样,为什么这是真的?

3 个答案:

答案 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 ++中,ax都称为聚合(请参阅我的回答: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)。