2016-04-03 108 views
0

指针只能以不连续的步骤移动。计算地址:指针+非负数

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

*是否为隐式计算,由编译器在编译时完成?*:是。究竟。 – haccks

+0

在数字系统中**每个**计算都是以不连续的步骤完成的。和“因此,形式上(p + 2)'计算为'(p + 2 * sizeof(int))'”。是错的。 '(p + 2)'计算为'(int *)((char *)p + 2 * sizeof(int))''。失格是一个不同的操作。你可能想读一本好的C书。 – Olaf

+0

该计算是隐式的,由编译器完成。与以0,1,2,3(不用乘以sizeof(int))相同的方式索引int []数组的方式相同,这同样适用于指针运算。 –

回答

3

问题是,这个计算是否隐含,由编译器在 编译时完成?

是的,这是隐含的,当你写ptr+n它实际上向前推进了N次的字节数指针对象类型的大小(例如在int*情况下 - 这是4个字节授予整数需要你的计算机上有四个字节)。

例如

int *x = malloc(4 * sizeof(int)); // say x points at 0x1000 
x++; // x now points at 0x1004 if size of int is 4 

你可以阅读更多指针算术。

1

因此,正式*(p+2)计算为*(p+2*sizeof(int))

不,*(p+2)计算为*(int*)((char*)p+2*sizeof(int))

即使简短一看,只有sizeof(int) == 1