静态强制转换 - C++ static_cast<无效 *>

static cast - C++ static_cast<void *>

本文关键字:无效 cast 转换 static C++ 静态      更新时间:2023-10-16

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

鉴于:

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

为什么以下值为真?

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

这是说address of aa一样吗?如果是这样,为什么会这样?

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

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

数组

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

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

int a[8];

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