-4

コードは次のとおりです。

#include<stdio.h>
main()
{
   char arr[]={'a','b','c','d'};
   char *i,*j,*k;
   i=&arr[1];
   j=&arr[2];
   k=&arr[3];
   printf("%s %p %p %p %s\n",(j-i)'i,j,k,(k-i));
}
  1. これをコンパイルしようとすると、表示されるエラーは、%s が (char *) を期待しているが、(つまり (ji)) が int であるということです。しかし、j&i を char ポインターとして定義したと思います。

  2. %s の代わりに %d を使用すると、(ji) の答えは 1 になり、(ki) は 2 になり、実際には要素の違いになります。

  3. 上記のように %p を使用して i、j、k のアドレスを出力すると、正しいアドレスが表示されますが、なぜ 2 つのアドレスを差し引いてバイト数の差を与えることができないのでしょうか?

あなたの視点を教えてください?

編集:ポインター差分に関する質問の2番目の部分のコードを追加:

#include<stdio.h> 

main() 
{ 
    int arr[]={10,20,34,65}; 
    int *i,*j,*k; 
    i=&arr[1]; 
    j=&arr[2]; 
    k=&arr[3]; 
    printf("%d %p %p %p %d\n",(j-i),i,j,k,(k-i)); 
}
4

1 に答える 1

1

誰も実際の答えを書くことを気にしないので:

  1. 別のポインターからポインターを引くと、ポインターの差が整数として得られます。

  2. ポインタ値の違いは、尖った型のサイズにあります(これは、何をするかを考えると明らかですintptr++)。

  3. バイトの差を取得するには、たとえば、タイプのサイズを掛けます(sizeof int)*(j-i)

于 2013-02-23T16:49:36.097 に答える