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

모든 응답(3)
刘奇

std::distance는 주소 차이가 아닌 반복자의 거리를 반환합니다.
예를 들어 std::distance(list::begin(),list::end())를 사용하여 연결된 목록에 있는 두 반복자 사이의 수를 계산할 수도 있으며, 우리는 주소가 연결리스트의 순서가 맞지 않습니다.
위의 포인터 c도 세 번 후에 d의 위치에 도달합니다. int*의 는 매번 sizeof(int)를 이동합니다.
일반적으로 거리의 구현은 for 루프에서 반복자를 이동한 다음 비교하여 둘 사이의 거리를 기록하는 것입니다.

大家讲道理

std::distancedc 사이의 바이트 수가 아니라 dc 사이의 元素 수를 반환합니다. 여기서 元素c 유형을 나타냅니다. dint이 속한 것입니다.

int의 크기가 4 bytes이므로 元素个数 = (C - 0) / 4 = 3

大家讲道理

으아아아

c는 스택의 상위 주소에 있는 a에 대한 포인터입니다

d는 스택의 낮은 주소에 있는 b에 대한 포인터입니다

c와 d의 차이는 12바이트인데, 12바이트는 int형 3개 크기가 차지하는 바이트입니다

으아아아

따라서 c와 d 사이의 거리는 3 int 유형 크기 바이트입니다

포인터가 이동하는 덧셈과 뺄셈의 거리는 포인터가 가리키는 글자의 크기입니다

이 문제의 포인터 덧셈과 뺄셈 결과는 int 개수(4바이트)가 되며 포인터는 비트 연산을 수행하지 않습니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿