c++ - 为什么这两个指针之间的距离是3?
PHP中文网
PHP中文网 2017-04-17 15:27:32
0
3
629
#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())來計算鍊錶兩個迭代器之間++的次數,而我們知道鍊錶的位址並不是順序排放的。
而上面的指標c,也是++三次之後達到d的位置。 int*的++每次是移動sizeof(int)的。
一般來說,distance的實作就是在for迴圈中++移動迭代器再進行比較從而記錄之間的距離的吧。

大家讲道理

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

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

大家讲道理
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(四位元組)的個數,指標不會進行位元運算

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板