プログラムに関する質問があります。コードは次のとおりです。
int main()
{
int *p,*q;
p=(int*)1000;
printf("%d ",p);
q=(int*)2000;
printf("%d",q);
printf("%d",(p-q));
return 0;
}
しかし、答えは
1000 
2000 
-250
で何が起こるのかp-q、なぜ答えが-250?になったのか理解できません。
正しいがおそらく役に立たない答え:p - qは と等しい(1000 - 2000) / (sizeof int). ほとんどの C コンパイルでsizeof intは、4 です。
潜在的により有用な答え: のような型キャストの効果(int*) 1000は未定義です。このコードは、アドレス 1000 でint へのポインターを作成します。そのアドレスはおそらく無効です。値が 1000 の int へのポインターを作成するには、次のように記述します。
int i = 1000;
int *p = &i;
が を指し、がp指す値は 1000 です。i*pp
これは、あなたが意図したことを示す正しいコードです。
int main() {
  int i = 1000;
  int j = 2000;
  int *p = &i;
  int *q = &j;
  printf("i = %d *p = %d\n", i, *p);
  printf("j = %d *q = %d\n", j, *q);
  printf("*p - *q = %d\n", *p - *q); 
}
    2 つのポインターを減算すると、それらが同じ配列を指している限り、結果はそれらを分離する要素の数になります。
お使いのプラットフォームでは、int は 4 バイトです。アドレス 2000 とアドレス 1000 の間に -250 要素があります。
p と q は両方とも同じ配列を指していないため、結果は未定義です。期待する結果を含め、任意の結果を得ることができます。
このプログラムでは未定義の動作が非常に多いため、出力される値は実際にはまったく重要ではありません。
p変数のアドレスだけを格納できるポインタ変数intです。しかし1000、無効なアドレスとして保存しています。そして2000、変数に格納していますq。
今、あなたはポインタ算術をやっていますp-q。常にポインター演算は、アドレスのタイプのサイズに基づいて出力を提供します。のように動作し(p - q)/sizeof(type)ます。
pとqがchar *変数であるかどうかを検討すると、次p-qのような出力が得られます-1000
あなたの場合p、変数であり、qサイズが4バイトであるかのように出力されます。のサイズが 2 バイトのコンパイラでこれを実行すると、結果が として得られます。int *p-q250intint-500