1

これはコードです:

#include<stdio.h>
#include<conio.h>

int main()
{
    int *p1,*p2;
    int m=2,n=3;
    m=p2-p1;
    printf("\np2=%u",p2);
    printf("\np1=%u",p1);   
    printf("\nm=%d",m);       
    getch();
    return 0;
}

これにより、次のような出力が得られます。

p2= 2686792
p1= 1993645620
m= -497739707

コードと出力に 2 つの疑問があります。

  1. 'm' は int であるため、p1 と p2 は両方ともポインターであり、m は整数であるため、入力として p2-p1 を使用しないでください。「'int' から 'int' への無効な変換」のようなエラーが発生しますそうではありません。なぜ?

  2. 入力を受け取った後でも、その差は有効ではありません。それはなぜです?

4

2 に答える 2

1

'm' は int であるため、p1 と p2 は両方ともポインターであり、m は整数であるため、入力として p2-p1 を使用しないでください。「'int' から 'int' への無効な変換」のようなエラーが発生しますそうではありません。なぜ?

このタイプのエラーまたは警告は、使用しているコンパイラによって異なります。C コンパイラは、多くの場合、プログラマーが首を吊るすための十分なロープを提供します...

入力を受け取った後でも、その差は有効ではありません。それはなぜです?

実際、その違いは正しいです!ポインター演算を使用して計算を実行しています。したがって、この例では..

p2= 2686792

p1= 1993645620

ポインタは初期化されていないため、上記のようなガベージ値が割り当てられます。ここで、操作 p2 - p1 を実行したいとします。つまり、 p2 のメモリ ブロックのちょうど p1 個前に来るメモリ アドレスを要求しています。p1 と p2 は整数へのポインタであるため、メモリ ブロックのサイズはsizeof(int)(ほとんどの場合 4 バイト) です。したがって:

p2 - p1 = (2686792 - 1993645620) / sizeof(int)= (2686792 - 1993645620) / 4 = -497739707

于 2013-08-07T18:50:40.840 に答える