ID非公開

2022/6/17 15:14

66回答

ポインタ同士の引き算ってアドレスの値の引き算じゃないんですか?

C言語関連194閲覧

ベストアンサー

0

その他の回答(5件)

0

>ポインタ同士の引き算ってアドレスの値の引き算 アセンブラ上がりで勝手にそう決めつけてる人がいたなぁ C は曲がりなりにも高級言語なので、もっと「役に立つ値」が得られるようになっている → 高級言語ではなく中級言語だと揶揄されている アドレスの値の差がわかったとしてどうするか? 差だけじゃ役に立たない ポインタの演算なら、大抵は sizeof(T) で割ったり掛けたりで要素数単位で使うことになる struct foo { /* fooのサイズはどんどん変わるよ! */ } bar[3]; struct foo *p = &bar[0]; struct foo *q = &buz[2]; な時、 ++p; --q; struct foo *r = buz + 1; int distance = p - q; は、sizeof(struct foo)を知らなくとも、要素数で扱えるよう sizeof(struct foo)で換算して計算される

0

T型へのポインタp1とp2であれば ((int)p2-(int)p1)/sizeof(T) が返ります...って言っても大丈夫かな。まぁ、普通のコンピュータなら。

0

アドレス間の要素数が帰ってきます。 (void *) の場合、引き算できないコンパイラがあります。

0

ポインタの演算は ポインタ±1= ±sizeof(元の型) ポインタ1−ポインタ2=(アドレス1−アドレス2) / sizeof(元の型) だから、同じ型のポインタ同士でないと引き算できないし、同じ配列内でないと怖いことが起きる。