인프런 커뮤니티 질문&답변
17분경 제가 이해한게 맞는지 확인 부탁드립니다.
작성
·
30
1
17분 경에 나오는 다음 코드에 대해 제가 올바르게 이해 한 것인지 궁금해서 질문 드립니다.
// 강의 17분 경 코드
const int** pp2;
int* p1;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;제가 이해한 부분들입니다.
애초에 포인터 변수
p1이 const 포인터 변수가 아닌데 이중포인터 변수pp2에 대입이 된 부분부터 일단 잘못 되었다.*pp2 = &n은*p1 = &n과 동일하다.p1은 const 포인터 변수가 아닌데 const 변수 n의 주소가 대입되어 p1이 n의 값을 변경할 수 있게 되었다.
질문입니다.
포인터 변수에서 const가 데이터 타입 왼쪽에 있으면 indirection을 하지 못하게 방지 하는 역할로 알고 있는데
*pp2 = &n이 어떻게 경고 없이 컴파일 된건지 궁금합니다.const 데이터 변수의 주소를 대입해서 그런걸까요?
답변 1
1
안녕하세요? 질문&답변 도우미 durams입니다.
애초에 포인터 변수
p1이 const 포인터 변수가 아닌데 이중포인터 변수pp2에 대입이 된 부분부터 일단 잘못 되었다.정확히는
const int를 최종적으로 가리키는 이중 포인터인pp2에int를 가리키는 주소를 대입하려 하는게 문제라고 볼 수 있겠네요. 강의에서 나온 것처럼 C++에서는 이런 문제를 컴파일러가 엄격하게 경고합니다.
*pp2 = &n은*p1 = &n과 동일하다.*p1 = &n가 아니라p1 = &n과 동일하다고 봐야합니다. 또한 이 마저도const가 어떻게 붙어있느냐에 따라 허용이 될 수도 되지 않을 수도 있습니다.const int** const pp2이렇게 이중 포인터를 선언하면pp2 = &p1은 불가능하구요,int* const p1이렇게 포인터를 선언하면pp2 = &p1은 가능하지만p1 = &n은 불가능합니다.
p1은 const 포인터 변수가 아닌데 const 변수 n의 주소가 대입되어 p1이 n의 값을 변경할 수 있게 되었다.
맞습니다.
포인터 변수에서 const가 데이터 타입 왼쪽에 있으면 indirection을 하지 못하게 방지 하는 역할로 알고 있는데, *pp2 = &n이 어떻게 경고 없이 컴파일 된건지 궁금합니다. const 데이터 변수의 주소를 대입해서 그런걸까요?
해당
const는 indirection(dereferencing)을 하지 못하게 막는 것이 아니라, 해당 포인터를 통해서 변수에 접근했을 때 변수를 상수로 취급한다는 의미입니다.const int* p와 같은 포인터 변수가 있을 때 역참조는 얼마든지 가능합니다. 다만 포인터를 통해 값을 수정하는 것이 불가능할 뿐입니다.'이중 포인터를 통해 접근했을 때 수정할 수 없는 포인터 변수'를 말씀하셨다고 가정하면, 이는
const int** pp2가 아닌int* const* pp2와 같이 작성해야합니다.const int** pp2는 이중 포인터가 두 번의 indirection을 통해 최종적으로 가리키는int를const로 취급하겠다는 의미입니다.*pp2 = &n가 경고 없이 컴파일된 이유는 둘의const수준이 동일하기 때문입니다.*pp2는 'const int를 가리키는 포인터이며,&n은 'const int의 주소'이기 때문입니다.
복잡한 포인터 변수의 선언을 해석하는 데 어려움이 있으실 수 있습니다. pointer to const와 const pointer의 차이에 대해서 검색해보시는 것도 좋구요, right-left rule이라는 선언 읽는 방법에 대해서 검색해보셔도 좋습니다.






깔끔하게 정리해주셔서 정말 감사합니다! 궁금한게 해소되었어요!