![](/img/trans.png)
[英]C++, Is it safe to static_cast to void* and back across processes?
[英]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 ++中, a
和x
都称为聚合(请参阅此处的答案: 什么是聚合? )
在几乎所有情况下,数组的名称都会变为指向数组第一个元素的指针。 因此,在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.