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

浏览:58日期:2023-03-27

问题描述

#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 00FDF7E0std::distance(d, c)求出的值是3可是他们地址相差不是C么,为什么是3?

问题解答

回答1:

std::distance返回的是迭代器的距离,而不是地址之差。比如你也可以用std::distance(list::begin(),list::end())来计算链表两个迭代器之间++的次数,而我们知道链表的地址并不是顺序排放的。而上面的指针c,也是++三次之后达到d的位置。int*的++每次是移动sizeof(int)的。一般来说,distance的实现就是在for循环中++移动迭代器再进行比较从而记录之间的距离的吧。

回答2:

std::distance返回的不是d与c之间的字节数,而是d与c之间存在的元素个数,这里的元素,就是指c、d所属的类型int。

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

回答3:

c和d的值是00FDF7EC 00FDF7E0

c为指向a的指针,在栈上高地址

d为指向b的指针,在栈上低地址

c和d之间相差12个字节,12个字节是3个int类型大小所占字节

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

所以c和d之间的距离为3个int类型大小的字节数

指针加减移动的距离是指针所指向类型的大小

该问题的指针加减得出的是int(四字节)的个数,指针不会进行位运算

相关文章: