int指针表达式

时间:2012-10-11 10:12:46

标签: c

#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纠正我。谢谢..

2 个答案:

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