指针只能以不连续的步骤移动。计算地址:指针+非负数
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
问题是,这个计算是否隐含,由编译器在编译时完成?
*是否为隐式计算,由编译器在编译时完成?*:是。究竟。 – haccks
在数字系统中**每个**计算都是以不连续的步骤完成的。和“因此,形式上(p + 2)'计算为'(p + 2 * sizeof(int))'”。是错的。 '(p + 2)'计算为'(int *)((char *)p + 2 * sizeof(int))''。失格是一个不同的操作。你可能想读一本好的C书。 – Olaf
该计算是隐式的,由编译器完成。与以0,1,2,3(不用乘以sizeof(int))相同的方式索引int []数组的方式相同,这同样适用于指针运算。 –