0

プログラムに関する質問があります。コードは次のとおりです。

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?になったのか理解できません。

4

4 に答える 4

12

正しいがおそらく役に立たない答え: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); 
}
于 2012-07-31T16:33:12.100 に答える
6

2 つのポインターを減算すると、それらが同じ配列を指している限り、結果はそれらを分離する要素の数になります。

お使いのプラットフォームでは、int は 4 バイトです。アドレス 2000 とアドレス 1000 の間に -250 要素があります。

p と q は両方とも同じ配列を指していないため、結果は未定義です。期待する結果を含め、任意の結果を得ることができます。

于 2012-07-31T16:37:14.160 に答える
0

このプログラムでは未定義の動作が非常に多いため、出力される値は実際にはまったく重要ではありません。

于 2012-07-31T16:20:59.047 に答える
0

p変数のアドレスだけを格納できるポインタ変数intです。しかし1000、無効なアドレスとして保存しています。そして2000、変数に格納していますq

今、あなたはポインタ算術をやっていますp-q。常にポインター演算は、アドレスのタイプのサイズに基づいて出力を提供します。のように動作し(p - q)/sizeof(type)ます。

pqchar *変数であるかどうかを検討すると、次p-qのような出力が得られます-1000

あなたの場合p、変数であり、qサイズが4バイトであるかのように出力されます。のサイズが 2 バイトのコンパイラでこれを実行すると、結果が として得られます。int *p-q250intint-500

于 2012-08-01T02:07:11.697 に答える