-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
포인터 질문있습니다.
23.06.22 12:03 작성 조회수 214
2
안녕하세요, 아래 두 코드가 동일하게 작동해야 한다고 생각했는데, 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);
}
답변을 작성해보세요.
2
Soobak
2023.06.23
안녕하세요, 답변 도우미 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 이후 부분만 참고하셔도 좋을 것 같습니다.
yahoo
질문자2023.06.24
감사합니다 !!
const pint ptr
은, 사실 int *const ptr
이었군요!
(const int *ptr
아님!)
신기하네요 ! 감사합니다!
답변 1