포인터 질문있습니다.
336
작성한 질문수 18
안녕하세요, 아래 두 코드가 동일하게 작동해야 한다고 생각했는데, 1이 틀린 이유가 궁금합니다.
1.
typedef int* pint;
void bar2(const pint ptr)
{
int val = 1;
ptr = &val;
}
2.
void bar(const int* ptr)
{
int val = 1;
ptr = &val;
}
1 full code
#include <iostream>
using namespace std;
typedef int* pint;
void bar2(const pint ptr)
{
int val = 1;
ptr = &val;
}
int main()
{
int length2 = 2;
pint ptr2 = &length2;
bar2(ptr2);
}
답변 1
3
안녕하세요, 답변 도우미 Soobak 입니다.
const 한정자가 포인터가 가리키고 있는 주소 에 적용되는 것 인지, 포인터가 가리키고 있는 주소에 있는 값 에 적용이 되는 것 인지에 대한 차이 때문입니다.
typedef int* pint;
void bar2(const pint ptr)
{
int val = 1;
ptr = &val;
}: 위 코드에서는 typedef 로 int* 자체를 pint 라는 자료형으로 별칭한 후, const로 한정하였습니다.
따라서, 포인터 ptr 자체가 const 로 한정됩니다.
이는 ptr 의 주소값 자체를 바꾸지 않겠다는 의미입니다.
이 때, ptr = &val; 코드 부분에서 포인터의 주소값 자체를 변경하려 하므로, 컴파일 에러가 발생하게 됩니다.
void bar(const int* ptr)
{
int val = 1;
ptr = &val;
}: 위 경우에서 const int* ptr 은 ptr 이 가리키는 값에 대하여 const 로 한정됩니다.
즉, 포인터가 가리키고 있는 주소에 있는 값 을 변경하지 않겠다는 의미이며, 포인터가 가리키고 있는 주소 자체는 변경할 수 있습니다.
따라서, ptr = &val; 은 문제가 없습니다.
C++ 에서 포인터를 const 로 한정하는 방법에는 포인터가 가리키고 있는 주소에 있는 값을 변경하지 않겠다는 것, 포인터가 가리키고 있는 주소를 변경하지 않겠다는 것 의 두 가지 경우가 있습니다.
관련된 내용은 강의 6.13 포인터와 const 에서 보다 자세히 학습하시게 되며,
잠시 해당 강의의 4:10 이후 부분만 참고하셔도 좋을 것 같습니다.
강의자료는 어디서 받을 수 있죠?
1
30
2
교재 있나요?
1
142
2
11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)
1
94
3
using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다
1
105
2
cstr직접구현
0
118
3
BubbleSort
1
79
2
숙제 마지막 부분
1
80
2
강의와 똑같이 진행했는데 링킹 에러가 발생합니다.
1
96
2
수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??
1
165
2
공변반환형 관련 문의 드립니다.
1
92
2
170강 유니크 포인터에대해 질문있습니다
1
82
1
섹션 5 퀴즈의 답이 이상합니다
1
86
2
이중포인터와 배열이 이해가 안됩니다.
1
159
2
5분 17~5분 34초 객체 잘림 질문
1
80
1
Resource.h 코드 알려주세요
1
74
1
char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다
1
95
2
화면좌측 숫자 보이기
1
116
1
화면 좌측 숫자 보이기
0
68
1
처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??
1
139
3
46강 string 버퍼 질문입니다
1
82
2
프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.
1
125
2
[] 범위 검사시 assert 사용 관련 질문
1
92
2
Lecture 클래스 멤버변수 명명 관련
0
93
2
프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요
0
75
1





