#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())來計算鍊錶兩個迭代器之間++的次數,而我們知道鍊錶的位址並不是順序排放的。
而上面的指標c,也是++三次之後達到d的位置。 int*的++每次是移動sizeof(int)的。
一般來說,distance的實作就是在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和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(四位元組)的個數,指標不會進行位元運算