计算地址:指针+非负数

时间:2016-04-03 19:58:03

标签: c pointers memory

指针只能以不连续的步骤移动。

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

问题是,这个计算是隐式的,由编译器在编译时完成吗?

2 个答案:

答案 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