繁体   English   中英

C ++ static_cast <void *>

[英]C++ static_cast<void *>

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

鉴于:

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的地址也与xi的地址一致(这是集合的第一个元素),因此将输出1

std::cout << (&x == &(x.i)) << std::endl; //1

所以你的情况, &a就像是&x ,和a (或&a[0]是像&(xi)

请注意,在C ++中, ax都称为聚合(请参阅此处的答案: 什么是聚合?

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

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

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

int a[8];

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM