プログラムに関する質問があります。コードは次のとおりです。
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
*p
p
これは、あなたが意図したことを示す正しいコードです。
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-q
250
int
int
-500