考虑这种情况:
int *ptr;
int offset;
ptr = <some_address>;
offset = 10;
假设它offset
是 32 位变量。ptr
有 type int*
,目标架构是 64 位(ptr
8 字节变量也是如此),offset
有 type int
。计算表达式的值时会进行什么转换*(ptr + offset)
?我在哪里可以阅读 2003 C++ 标准中的相关信息?
考虑这种情况:
int *ptr;
int offset;
ptr = <some_address>;
offset = 10;
假设它offset
是 32 位变量。ptr
有 type int*
,目标架构是 64 位(ptr
8 字节变量也是如此),offset
有 type int
。计算表达式的值时会进行什么转换*(ptr + offset)
?我在哪里可以阅读 2003 C++ 标准中的相关信息?
这就是标准对这个 [expr.add]/4 所说的:
当具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组 object84 的元素,并且数组足够大,则结果指向与原始元素偏移的元素,使得结果和原始数组元素的下标之差等于积分表达式。换句话说,如果表达式 P 指向数组对象的第 i 个元素,则表达式 (P)+N(等效于 N+(P))和 (P)-N(其中 N 的值为 n)指向分别表示数组对象的第 i + n 个和 i ≠ 第 n 个元素,前提是它们存在。
简单来说,这意味着当你写. 时,ptr
指向的地址会递增。offset * sizeof(*ptr)
ptr + offset