搜尋

首頁  >  問答  >  主體

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中文网2814 天前645

全部回覆(3)我來回復

  • 怪我咯

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

    std::distance回傳的是迭代器的距離,而不是位址之差。
    例如你也可以用std::distance(list::begin(),list::end())來計算鍊錶兩個迭代器之間++的次數,而我們知道鍊錶的位址並不是順序排放的。
    而上面的指標c,也是++三次之後達到d的位置。 int*的++每次是移動sizeof(int)的。
    一般來說,distance的實作就是在for迴圈中++移動迭代器再進行比較從而記錄之間的距離的吧。

    回覆
    0
  • 大家讲道理

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

    std::distance回傳的不是dc之間的位元組數,而是dc之間存在的元素個數,這裡的元素,就是指cd所屬的類型int

    因為int大小為4 bytes,所以元素个数 = (C - 0) / 4 = 3

    回覆
    0
  • 大家讲道理

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

    c和d的值是00FDF7EC 00FDF7E0

    c為指向a的指針,在堆疊上高位址

    d為指向b的指標,在堆疊上低位址

    c和d相差12個位元組,12個位元組是3個int型別大小所佔位元組

    std::distance(d, c)求出的值是3
    
    sizeof(int) 为 4
    
    12 / 4  = 3

    所以c和d之間的距離為3個int型別大小的位元組數

    指針加減移動的距離是指針所指向類型的大小

    該問題的指標加減得出的是int(四位元組)的個數,指標不會進行位元運算

    回覆
    0
  • 取消回覆