8

2 つのアドレスの違いが間違っているのはなぜですか? http://codepad.org/NGDqFWjJ

#include<stdio.h>
int main()
{
   int i = 10, j = 20;
   int *p = &i;
   int *q = &j;
   int c = p - q;
   printf("%d\n", p);
   printf("%d\n", q);
   printf("%d", c);
   return 0;
}

出力:

-1083846364
-1083846368
1
4

3 に答える 3

25

第 1 に、関連のないポインターに対して実行される場合、ポインター演算は定義されません。

第二に、それは理にかなっています。ポインターを減算すると、バイト数ではなく、それらのアドレス間の要素数が得られます。

あなたがそれを試すなら

char *p1 = &i, *p2 = &j;

別の結果が得られます。


補足として、%pポインターを印刷するときに使用します。

于 2012-03-24T20:49:04.997 に答える
13

他の人が言ったように、得られる結果は、ポインターが指している型のサイズの倍数になります。それらをcharポインターにキャストすると、得られる結果はバイト単位になります。また、ptrdiff_t typeを使用して、64 ビット ポインターを使用するシステムで結果を保持するのに十分な大きさの型を使用する必要があります。

ptrdiff_t c = (char*)p - (char*)q;

また、同じ配列にない 2 つの値のアドレスの差を取ることは、標準では定義されていませんが、ほぼすべてのシステムで機能することに注意してください。

于 2012-03-24T20:55:21.690 に答える
2

厳密に言えば、プログラムはいくつかの種類の未定義の動作を引き起こします。最初は無関係なポインターのポインター演算が原因で、次に print ステートメントのフォーマット文字列と引数が一致していないことが原因です。ただし、それらが修正されたとしても、同じ結果が表示されます。差が 1 である理由は、ポインター演算がポイントされた型のサイズの単位で結果を与えるためintですint *

于 2012-03-24T20:52:02.263 に答える