포인터와 함께 const를 사용하면 문제의 포인터를 사용하여 포인터를 역 참조함으로써 pointee를 수정할 수 없게됩니다. 하지만 포인터가 직접 가리키고 있지 않은 부분을 수정할 수없는 이유는 무엇입니까? 예를 들어C에서 const 및 포인터
:
int a = 3;
const int* ptr = &a;
*ptr = 5;
가 컴파일되지 않습니다. 그런데 왜
*(ptr + 2) = 5;
도 컴파일되지 않습니까? 나는 포인터가 무엇을 가리키고 있는지 바꾸지 않을 것이다.
그런 식으로 포인터를 사용하여 const를 사용하면 포인터가 참조하는 것 (포인터를 역 참조하는 것)뿐만 아니라 포인터를 사용하여 얻는 주소를 수정할 수 없다는 것을 말해야합니까?
나는이 예에서 할당되지 않은 메모리에 액세스하려고 시도하고 있음을 알고 있지만 이것은 단지 논의를위한 것입니다.
그래서 컴파일러가 첫 번째'sizeof (int)'바이트 만'const'라고 가정하기를 기대 했습니까? 컴파일러는'ptr'로 접근 한 메모리 주소가 읽기 전용 주소 ("물리적으로"읽기 전용이거나 적어도'ptr '을 사용하는 함수의 "관점"에서 읽기 전용이라고 가정합니다. '). –