17분경 제가 이해한게 맞는지 확인 부탁드립니다.
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이라는 선언 읽는 방법에 대해서 검색해보셔도 좋습니다.
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





