c++ - 为什么这两个指针之间的距离是3?
PHP中文网
PHP中文网 2017-04-17 15:27:32
0
3
634
#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讲师

membalas semua(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(四字节)的个数,指针不会进行位运算

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan