ホームページ  >  に質問  >  本文

c++ - 为什么这两个指针之间的距离是3?

#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中文网2765日前615

全員に返信(3)返信します

  • 怪我咯

    怪我咯2017-04-17 15:29:32

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:29:32

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

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 15:29:32

    リーリー

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

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

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

    リーリー

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

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

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

    返事
    0
  • キャンセル返事