시퀀스의 요소를 가리 키지 않는 포인터에 정수 값을 증가 / 감소 또는 추가하고 있습니까? 정의되지 않은 동작?

Dec 07 2020

포인터 (배열 요소에 대한)와 반복자는 요소 시퀀스를 걷기 위해 증가 / 감소 될 수 있고 시퀀스의 요소를 앞뒤로 이동할 수 있다는 것을 알고 있습니다.

그러나 단일 개체에 대한 포인터를 증가 시키거나 정수 값을 추가하면 어떻게 될까요? 정의되지 않은 동작입니까 아니면 정상이지만 해당 메모리에 액세스 할 수 없습니까?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';

예를 들어 시퀀스 또는 배열의 요소를 가리 키지 않는 포인터를 증가 / 감소해서는 안된다는 것을 이미 읽었 기 때문입니다.

그래서 누군가가 무슨 일이 일어나고 내 예제가 괜찮은지 (비 참조 포인터 p)를 설명 할 수 있습니까? 감사합니다!

답변

2 告白气球 Dec 23 2020 at 16:33

포인터 산술이 객체를 가리키는 포인터에 적용될 때, 포인터는 표준 에서 말한 것처럼 하나의 요소 만있는 해당 객체 유형의 배열을 가리키는 것으로 간주됩니다 .

배열 요소가 아닌 개체는 이러한 목적으로 단일 요소 배열에 속하는 것으로 간주됩니다.

예를 들어, 포인터 pint arr[1] = {551}So를 가리키는 것처럼 해당 작업은를 가리키는 포인터에 적용하는 것과 유사합니다 arr. 즉, ++p만들 p소자 도착 [1] (가상)를 가리킨 --pp다시 제 1 엘리먼트 도착 [0]로 가리킨. 따라서 마지막으로 역 참조 포인터 p는 정상이며 UB가 발생하지 않습니다.