Rumah > Soal Jawab > teks badan
#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(四字节)的个数,指针不会进行位运算