Spr*_*eet 4 c pointers addition
我知道一元运算符++将一个加到一个数字上.但是,我发现如果我在一个int指针上执行它,它会递增4(我的系统上的int的sizeof).为什么这样做?例如,以下代码:
int main(void)
{
int *a = malloc(5 * sizeof(int));
a[0] = 42;
a[1] = 42;
a[2] = 42;
a[3] = 42;
a[4] = 42;
printf("%p\n", a);
printf("%p\n", ++a);
printf("%p\n", ++a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将返回三个数字,每个数字之间相差4.
这就是C的方式 - 完整的解释在规范中,第6.5.6节"附加算子",第8段:
当一个具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型.如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式.换句话说,如果表达式
P指向数组对象的第i个元素,则表达式(P)+N(等效地N+(P))和(P)-N(其中N值为n)分别指向i + n和i - n -th数组对象的元素,只要它们存在即可.此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向数组对象的最后一个元素之后,如果表达式Q指向一个超过数组对象的最后一个元素,则表达式(Q)-1指向最后一个元素数组对象.如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.如果结果指向数组对象的最后一个元素之后,则不应将其用作*已计算的一元运算符的操作数.
要将它与您对前缀++运算符的使用联系起来,您还需要阅读第6.5.3.1节"前缀增量和减量运算符",第2段:
前缀
++运算符的操作数的值递增.结果是增量后操作数的新值.表达式++E相当于(E+=1).
而且还第6.5.16.2复合赋值,第3段:
阿化合物分配形式的运算从简单赋值表达式的不同运算仅在该左值只计算一次.
E1= E2E1 = E1(E2)E1