#include<stdio.h>
#include<stdlib.h>
int main ()
{
int a[]={0,1,2,3,4};
int *p[]={a,a+1,a+2,a+3,a+4};
int **ptr=p;
ptr++;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
*ptr++;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
*++ptr;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
++*ptr;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
return 0;
}
该计划的答案是 1 1 1
2 2 2
3 3 3
3 4 4
用gcc.But为什么第一个给出1 1 1的printf的输出不应该是4 4 1? 让我们说如果p = 6004并且ptr将是6004而ptr ++将是6008.then-p应该给4.pls纠正我。谢谢..
答案 0 :(得分:2)
指针运算的结果并不完全是它们的地址算术的结果。输出应为((address of ptr) - (address of p)) / (sizeof(pointed_type))
例如:
int a[] = {0,1,2,3,4};
int *p=a;
int *p2 = p+1;
printf("%d",p2-p) // will print 1
答案 1 :(得分:0)
我修改了一点以确定。这里的要点是减去指针返回单位数,即指针的地址/大小,而不是地址位置的明显差异。
printf("ptr before %p\n", ptr);
ptr++;
printf("ptr after %p and p %p\n", ptr, p);
printf("%ld %ld %d\n",ptr-p,*ptr-a,**ptr);
在我的64位机器上,打印的地址相隔8个位置,只有一个++。在32位机器上,这将是4.但算术差异仍然会返回1.