0
#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。但是为什么第一个 printf 的输出给出 1 1 1 不应该是 4 4 1?假设如果 p=6004 并且 ptr 将是 6004 并且 ptr++ 将是 6008.then ptr-p 应该给 4.pls 正确的我。谢谢..

4

2 回答 2

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
于 2012-10-11T10:27:16.560 回答
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。

于 2012-10-11T10:28:51.913 回答