#include <iostream>
#include <iterator>
int main()
{
int a, b;
int *c = &a, *d = &b;
std::cout << std::hex << c << " " << d << std::endl;
std::cout << std::hex << std::distance(d, c) << std::endl;
return 0;
}
我运行时显示
c和d的值是00FDF7EC 00FDF7E0
std::distance(d, c)求出的值是3
可是他们地址相差不是C么,为什么是3?
怪我咯2017-04-17 15:29:32
std:: distance は、アドレスの差ではなく、反復子の距離を返します。
たとえば、 std:: distance(list::begin(),list::end()) を使用して、リンク リスト内の 2 つの反復子間の ++ の数を計算することもできます。リンクリストの排出が順番に並んでいません。
上記のポインタ c も ++ を 3 回繰り返して d の位置に到達します。 int* の ++ は毎回 sizeof(int) を移動します。
一般的に言えば、距離の実装は、for ループ内で反復子を ++ 移動し、比較してそれらの間の距離を記録することです。
大家讲道理2017-04-17 15:29:32
std::distance
は、d
と c
の間のバイト数ではなく、d
と c
の間の 元素
の数を返します。ここでの 元素
は、型 c
を指します。 d
と int
が属します。
int
のサイズは 4 bytes
なので、元素个数 = (C - 0) / 4 = 3
大家讲道理2017-04-17 15:29:32
リーリー
c は、スタックの上位アドレスにある a へのポインタです
d は、スタックの下位アドレスにある b へのポインタです
c と d の差は 12 バイトであり、12 バイトは 3 つの int 型のサイズが占めるバイトです
リーリーc と d の間の距離は int 型サイズの 3 バイトです
足し算と引き算でポインタが移動する距離が、ポインタが指す型のサイズになります
この問題でのポインタの加算と減算は int の数 (4 バイト) となり、ポインタはビット演算を実行しません