본문 바로가기

프로그래밍 언어 정리/C, C++

[C/C++] 포인터와 상수

int i1 = 1;
int i2 = 2;

const int* p1 = &i1;
int* const p2 = &i2;

 

상수 키워드 const와 포인터를 쓰다보면 같아 보이지만 위의 코드처럼 다른 두 가지 경우가 등장합니다.

 

p1의 const는 p1이 참조하는 i1의 값을 바꾸지 못하게 합니다.

p2의 const는 p2가 값을 바꾸지 못하게 합니다.

 

 

말로만 보면 어려우니 코드로 확인해보겠습니다.

 

#include <iostream>

using namespace std;

int main() {
    const char * s1 = "Hello";
    
    int i1 = 1;
    int i2 = 2;

    const int* p1 = &i1;
    int* const p2 = &i2;


    int i3 = 3;
    int i4 = 4;

    (*p1) = 11; // 이건 안됨.
    i1 = 111; // 이렇게 바꾸는 건 됨.
    p1 = &i3;

    (*p2) = 22;
    i2 = 222;
    p2 = &i4; // 이것도 안됨.

    return 0;
}

 

p1의 경우 p1을 역참조하여 값을 바꾸는 것은 불가능합니다.

하지만 p1이 역참조하는 변수의 값을 직접 바꾸는 것은 가능합니다.

그리고 p1 자체의 값(주소값)을 바꾸는 것은 가능합니다.

 

p2의 경우 p2를 역참조하여 값을 바꾸는 것은 가능합니다.

당연히 역참조하는 변수의 값을 직접 바꾸는 것도 가능합니다.

하지만 p2 자체의 값(주소값)을 바꾸는 것은 불가능합니다.