基本上当我运行它时,它会打印1和2。 首先,ptr2 - ptr应该是4,因为我看到指向这样的东西的指针,其中每个| |代表一个字节:
|0|0|0|0| 0|0|1|0|
ptr..........ptr2
当我们减去指针时,我们减去它们指向的地址,对吧?所以我希望打印4然后打印2,因为内存已经连续分配。
当然这不是实际输出。那么我的想法在哪里不正确?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr;
ptr = (int *)malloc(2*sizeof(int));
int *ptr2;
ptr2 = &ptr[1];
printf("%d\n", ptr2 - ptr);
ptr[1] = 2;
printf("%d", ptr2[0]);
free(ptr);
return 0;
}
答案 0 :(得分:3)
当你减去两个指针时,结果不是数值之间的差异,而是元素的数量差异。
由于ptr
指向数组的第一个元素而ptr2
指向第二个元素,因此两者之间存在一个元素差异,这就是结果。
关于Additive Operators的C standard的第6.5.6节声明如下:
9 当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组最后一个元素的元素 宾语; 结果是两者下标的差异 数组元素。
如果要查看地址之间的字节差异,可以将指针强制转换为char *
:
char *p1 = (char *)ptr;
char *p2 = (char *)ptr2;
printf("%td\n", p2 - p1);