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

しかし、最初の printf の出力が 1 1 1 であって、4 4 1 であってはならないのはなぜですか? p=6004 で、ptr が 6004 で ptr++ が 6008 の場合、ptr-p は 4.pls の正しい me.thanks を与えるはずです..

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 か所離れており、++ が 1 つだけです。32 ビット マシンでは、これは 4 になります。それでも、算術差は 1 を返します。

于 2012-10-11T10:28:51.913 に答える