指针算术和整体推广

Siy*_*Ren 6 c c++ standards pointers

在表达式中p + a,哪里p是指针类型并且a是一个整数,整数提升规则是否适用?例如,如果a是a char,在64位机器上它肯定会被扩展到64位,然后再添加到指针值(在编译的程序集中),但它是否由标准指定?什么会被提升?int,intptr_t还是ptrdiff_t?什么会unsigned charsize_t转换为?

Gle*_*aum 3

标准似乎并不要求发生任何促销,因为char是整数类型:

对于加法,两个操作数都应具有算术或无范围枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,而另一个操作数应具有整型或无范围枚举类型

看来实现可能取决于底层架构允许的指针添加类型 - 因此如果架构支持address+BYTE- 一切都很好char- 如果不支持,它可能会提升到支持的最小地址偏移大小。

指针减法的结果定义为“std::ptrdiff_t”类型

当两个指向同一数组对象的元素的指针相减时,结果是两个数组元素的下标之差。结果的类型是实现定义的有符号整型;该类型应与标头中定义为 std::ptrdiff_t 的类型相同