• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

포인터 질문있습니다.

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);
}

 

 

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.06.23

안녕하세요, 답변 도우미 Soobak 입니다.

const 한정자가 포인터가 가리키고 있는 주소 에 적용되는 것 인지, 포인터가 가리키고 있는 주소에 있는 값 에 적용이 되는 것 인지에 대한 차이 때문입니다.

typedef int* pint;
void bar2(const pint ptr)
{
    int val = 1;
    ptr = &val;
}

: 위 코드에서는 typedefint* 자체를 pint 라는 자료형으로 별칭한 후, const로 한정하였습니다.
따라서, 포인터 ptr 자체가 const 로 한정됩니다.
이는 ptr 의 주소값 자체를 바꾸지 않겠다는 의미입니다.
이 때, ptr = &val; 코드 부분에서 포인터의 주소값 자체를 변경하려 하므로, 컴파일 에러가 발생하게 됩니다.

void bar(const int* ptr)
{
    int val = 1;
    ptr = &val;
}

: 위 경우에서 const int* ptrptr 이 가리키는 값에 대하여 const 로 한정됩니다.
즉, 포인터가 가리키고 있는 주소에 있는 값 을 변경하지 않겠다는 의미이며, 포인터가 가리키고 있는 주소 자체는 변경할 수 있습니다.
따라서, ptr = &val; 은 문제가 없습니다.

C++ 에서 포인터를 const 로 한정하는 방법에는 포인터가 가리키고 있는 주소에 있는 값을 변경하지 않겠다는 것, 포인터가 가리키고 있는 주소를 변경하지 않겠다는 것 의 두 가지 경우가 있습니다.
관련된 내용은 강의 6.13 포인터와 const 에서 보다 자세히 학습하시게 되며,
잠시 해당 강의의 4:10 이후 부분만 참고하셔도 좋을 것 같습니다.

yahoo님의 프로필

yahoo

질문자

2023.06.24

감사합니다 !!

const pint ptr은, 사실 int *const ptr 이었군요!

(const int *ptr 아님!)

신기하네요 ! 감사합니다!