指针只能以不连续的步骤移动。
int *p;
p = malloc(sizeof(int)*8);
因此,形式上*(p + 2)计算为*(p + 2 * sizeof(int))。
但是,如果我实际编码上面两个,我会得到不同的结果,这似乎是可以理解的。
*p = 123;
*(p+2) = 456;
printf("%d\n",*(p+2*(sizeof(int)))); \\0
printf("%d\n",*(p+2)); \\456
问题是,这个计算是隐式的,由编译器在编译时完成吗?
答案 0 :(得分:3)
问题是,这个计算是隐含的,由编译器完成 编译时间?
是的,这是隐含的,当你写ptr+n
时它实际上向前推进n次与指针类型大小一样多的字节(例如在int*
的情况下 - 这是4个字节授予整数需要4个字节在你的电脑)。
e.g。
int *x = malloc(4 * sizeof(int)); // say x points at 0x1000
x++; // x now points at 0x1004 if size of int is 4
您可以阅读有关指针算术的更多信息。
答案 1 :(得分:1)
因此,正式
*(p+2)
计算为*(p+2*sizeof(int))
。
不,*(p+2)
计算为*(int*)((char*)p+2*sizeof(int))
。
即使是一个简短的表情也会发现,你的陈述的唯一方法是sizeof(int) == 1
。