首页  >  问答  >  正文

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中文网2765 天前613

全部回复(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
  • 取消回复