c++ - 为什么这两个指针之间的距离是3?
PHP中文网
PHP中文网 2017-04-17 15:27:32
0
3
617
#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?

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(3)
刘奇

std:: distance は、アドレスの差ではなく、反復子の距離を返します。
たとえば、 std:: distance(list::begin(),list::end()) を使用して、リンク リスト内の 2 つの反復子間の ++ の数を計算することもできます。リンクリストの排出が順番に並んでいません。
上記のポインタ c も ++ を 3 回繰り返して d の位置に到達します。 int* の ++ は毎回 sizeof(int) を移動します。
一般的に言えば、距離の実装は、for ループ内で反復子を ++ 移動し、比較してそれらの間の距離を記録することです。

いいねを押す +0
大家讲道理

std::distance は、dc の間のバイト数ではなく、dc の間の 元素 の数を返します。ここでの 元素 は、型 c を指します。 dint が属します。

int のサイズは 4 bytes なので、元素个数 = (C - 0) / 4 = 3

いいねを押す +0
大家讲道理

リーリー

c は、スタックの上位アドレスにある a へのポインタです

d は、スタックの下位アドレスにある b へのポインタです

c と d の差は 12 バイトであり、12 バイトは 3 つの int 型のサイズが占めるバイトです

リーリー

c と d の間の距離は int 型サイズの 3 バイトです

足し算と引き算でポインタが移動する距離が、ポインタが指す型のサイズになります

この問題でのポインタの加算と減算は int の数 (4 バイト) となり、ポインタはビット演算を実行しません

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート