考虑这种情况:
int *ptr;
int offset;
ptr = <some_address>;
offset = 10;
假设offset
是32位变量。ptr
具有int*
类型,目标体系结构为64位(因此ptr
是8字节变量),offset
具有int
类型。计算表达式*(ptr + offset)
的值时,将执行什么转换?在2003 C 标准中,我在哪里可以阅读有关它的信息?
这是标准对此[expr.add]/4:
的说法当将具有积分类型的表达式添加到指针中时,结果具有指针操作数的类型。如果指针操作数指向数组对象84的元素,并且数组足够大,则结果指向与原始元素的元素偏移,以使结果和原始数组元素的下标差等于积分表达式。换句话说,如果表达式p指向数组对象的第i-the元素,则表达式(p) n(等效地,n (p))和(p)-n(其中n具有值n)点分别为数组对象的i n-th和i≠n元素。
用更简单的单词,这意味着在编写ptr + offset
时,ptr
指向的地址会增加offset * sizeof(*ptr)
。