#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)를 이동합니다.
일반적으로 거리의 구현은 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는 스택의 상위 주소에 있는 a에 대한 포인터입니다
d는 스택의 낮은 주소에 있는 b에 대한 포인터입니다
c와 d의 차이는 12바이트인데, 12바이트는 int형 3개 크기가 차지하는 바이트입니다
으아아아따라서 c와 d 사이의 거리는 3 int 유형 크기 바이트입니다
포인터가 이동하는 덧셈과 뺄셈의 거리는 포인터가 가리키는 글자의 크기입니다
이 문제의 포인터 덧셈과 뺄셈 결과는 int 개수(4바이트)가 되며 포인터는 비트 연산을 수행하지 않습니다