静态强制转换 - C++ static_cast<无效 *>
static cast - 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
的地址也与x.i
的地址一致(这是聚合的第一个元素(,所以这将打印1
:
std::cout << (&x == &(x.i)) << std::endl; //1
所以在你的情况下,&a
就像&x
,而a
(或&a[0]
(就像&(x.i)
。
请注意,在C++ a
和x
中都称为聚合(请参阅我的答案:什么是聚合?
在几乎所有上下文中,数组的名称都会衰减为指向数组第一个元素的指针。所以在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( 的地址。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误