在 ISO/IEC 9899:TC2 中,该标准规定如下
6.3.2.3 指针
- 指向对象或不完整类型的指针可以转换为指向不同类型的指针
对象或不完整类型。如果生成的指针未针对所指向的类型正确对齐,则行为未定义。否则,当再次转换回来时,结果应等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向该对象的最低寻址字节
物体。结果的连续增量,直到对象的大小,产生指向对象的剩余字节的指针。
因此,标准中并不清楚一种类型的指针是否可以转换为另一种类型的指针。
严格的别名规则在其他地方定义。这是这样的写法:
C(ISO/IEC 9899:1999 6.5/7):
对象的存储值只能由左值访问
具有以下类型之一的表达式:
- 与对象的有效类型兼容的类型,
- 与有效类型兼容的类型的限定版本
物体,
- 对应于有符号或无符号类型的类型
对象的有效类型,
- 对应于 a 的有符号或无符号类型的类型
对象有效类型的限定版本,
- 包含上述之一的聚合或联合类型
其成员中的类型(递归地包括
子聚合或包含联合),或
- 一种字符类型。
C++(ISO/IEC 14882:2011 3.10 [basicl.lval] / 15):
如果程序尝试通过以下方式访问对象的存储值
左值不是以下类型之一的行为是
不明确的:
- 对象的动态类型,
- 对象动态类型的 cv 限定版本,
- 与对象的动态类型类似的类型(如 4.4 中定义),
- 对应于有符号或无符号类型的类型
对象的动态类型,
- 对应于 a 的有符号或无符号类型的类型
对象动态类型的 cv 限定版本,
- 包含上述之一的聚合或联合类型
其元素或非静态数据成员之间的类型(包括,
递归地,子聚合的元素或非静态数据成员
或包含联合),
- 是(可能是 cv 限定的)基类类型的类型
对象的动态类型,
- a
char
or unsigned char
type.
只要不存在对齐问题,C 标准并不禁止您将指针强制转换为不相关的类型。但是,由于严格的别名规则,您基本上无法取消引用从此类强制转换获得的指针。因此,处理这种“无效”指针的唯一有用的方法是将其转换回正确的类型(或兼容的类型)。
在 C++ 中,与reinterpret_cast (5.2.10 [expr.reinterpret.cast] / 7) 基本相同:
对象指针可以显式转换为不同类型的对象指针。当纯右值v
类型为“指向T1
” 转换为类型“指向cv T2
”,结果是static_cast<cv T2*>(static_cast<cv void*>(v))
如果两者都T1
and T2
是标准布局类型(3.9)和对齐要求T2
并不比那些更严格T1
,或者如果任一类型是void
。将“指针”类型的纯右值转换为T1
” 到类型“指针T2
“ (在哪里T1
and T2
是对象类型,其中对齐要求T2
并不比那些更严格T1
)并返回到其原始类型,产生原始指针值。任何其他此类指针转换的结果均未指定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)