inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.15 포인터의 호환성

17분경 제가 이해한게 맞는지 확인 부탁드립니다.

해결된 질문

74

Lucas

작성한 질문수 27

1

17분 경에 나오는 다음 코드에 대해 제가 올바르게 이해 한 것인지 궁금해서 질문 드립니다.

// 강의 17분 경 코드
const int** pp2;
int* p1;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;

c

답변 1

1

durams

안녕하세요? 질문&답변 도우미 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이라는 선언 읽는 방법에 대해서 검색해보셔도 좋습니다.


1

Lucas

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

Export template 안됨

1

65

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

92

3

main 함수에서 왜 int만 선언이 되는걸까요

1

81

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

77

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

78

1

프로토타입과 함수간의 인자 불일치

1

87

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

171

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

73

2

getchar(), putchar()

1

111

3

강의자리ㅛ

1

93

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

65

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

61

2

11.6 fit_str함수를 구현해 봤습니다.

1

59

2