강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Lucas님의 프로필 이미지
Lucas

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.15 포인터의 호환성

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를 최종적으로 가리키는 이중 포인터인 pp2int를 가리키는 주소를 대입하려 하는게 문제라고 볼 수 있겠네요. 강의에서 나온 것처럼 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 데이터 변수의 주소를 대입해서 그런걸까요?

  1. 해당 const는 indirection(dereferencing)을 하지 못하게 막는 것이 아니라, 해당 포인터를 통해서 변수에 접근했을 때 변수를 상수로 취급한다는 의미입니다. const int* p와 같은 포인터 변수가 있을 때 역참조는 얼마든지 가능합니다. 다만 포인터를 통해 값을 수정하는 것이 불가능할 뿐입니다.

  2. '이중 포인터를 통해 접근했을 때 수정할 수 없는 포인터 변수'를 말씀하셨다고 가정하면, 이는 const int** pp2가 아닌 int* const* pp2와 같이 작성해야합니다. const int** pp2는 이중 포인터가 두 번의 indirection을 통해 최종적으로 가리키는 intconst로 취급하겠다는 의미입니다.

  3. *pp2 = &n가 경고 없이 컴파일된 이유는 둘의 const 수준이 동일하기 때문입니다. *pp2는 'const int를 가리키는 포인터이며, &n은 'const int의 주소'이기 때문입니다.


복잡한 포인터 변수의 선언을 해석하는 데 어려움이 있으실 수 있습니다. pointer to const와 const pointer의 차이에 대해서 검색해보시는 것도 좋구요, right-left rule이라는 선언 읽는 방법에 대해서 검색해보셔도 좋습니다.


Lucas님의 프로필 이미지
Lucas
질문자

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

Lucas님의 프로필 이미지
Lucas

작성한 질문수

질문하기