12

次のコード フラグメントを検討してください。

int (*p)[3];
int (*q)[3];

q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);

私はポインタ演算がインテリジェントであることを知っています。つまり、操作が次の 3 整数配列を指すのに十分なバイト数だけ先にq++進むことを意味します。そのため、最初の出力が ' ' であることqは驚くことではありません。12, 0q

しかし、2 番目のプリント私を驚かせます。1が印刷されます!
では、なぜ 12 ではなく 1 を出力するのでしょうか? それは私を困惑させるだけです。

4

2 に答える 2

27

++インクリメント演算子と同様に、-ポインターを使用した減算演算子も、ポイントされているオブジェクトのサイズを考慮します。具体的には、返される結果は、ポインター値のバイト数の差を、ポイント先のオブジェクトのサイズ (この例では 12) で割ったものです。したがって、違いは 12 バイトをサイズ 12 で割った値、つまり 1 です。

于 2009-04-17T09:07:54.980 に答える
4

本当に違いを知りたい場合は、各ポインターを (char*) にキャストし、次に (int) にキャストしてから減算します。それはあなたに答えを与えるはずです。

このコードは絶対値を与えます:

printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));

math.h を含めることを忘れないでください。

編集:コメントで指摘されているように、ダブルキャストは必要ありません。各ポインターポインターを int にキャストしてから減算すると、上記の (不要な) 二重キャストと同じ答えが得られます。

printf("%d\n", abs((int)(q) - (int)(p)));
于 2009-04-17T09:34:44.277 に答える