더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 17.const와 포인터

더듬이 2021. 8. 31. 20:09
728x90

포인터 변수는 주소를 가리키는 변수이다.

포인터 변수는

현재 자신이 가지고 있는 주소를 다른 주소로, 혹은 아무것도 가리키지 않도록 바꿀 수도 있고,

아니면 현재 주소가 가리키는 값을 수정할 수도 있다.


const와 포인터가 만나면?

포인터 변수가 상수화가 된다면 두가지의 경우를 생각해볼 수 있다.

1.포인터가 가리키는 변수를 상수화

int a;
int b;
const  int* pointer = &a;
a = 400;//가능
pointer=&b;//가능
*pointer=500//불가능
cout << *pointer << endl;

const 수식어가 포인터 앞에 온다면 이것은 이 포인터를 이용해 변수의 값을 수정하는 것을 막는다.

*pointer 의 값이 상수화가 되었다는 뜻과 같다.

따라서, pointer의 주소를 바꿀 수는 있어도, 역참조 연산자를 이용하여 pointer가 가리키는 값을 수정하지는 못한다.

하지만, a는 상수화가 되지 않았음으로 a에 직접 접근하여 a의 값을 바꿀 수는 있다.

이런 식의 const수식어는 상수화를 시켜준다기 보다는 값을 변경하는 방법에 제한을 두는 것이다.

2.포인터 가지는 주소를 상수화

int a=100;
    int b=200;
    int* const pointer = &a;
    *pointer = 500;//가능
    pointer = &b;//불가능

const수식어가 포인터 뒤에 온다면 이 포인터는 a의 주소를 가지는 고정된 포인터가 된다!

즉, 포인터 변수 자체를 상수화 하겠다는 뜻이다!

이 포인터는 a변수만을 가리키게 되고, 그 값은 변하지 않는 상수이다.

또한, *의 위치는 반드시 const전에 선언되야 하고, 선언과 동시에 초기화 해주어야 한다.

이 경우에는 역참조 연산자를 이용해 pointer가 가리키는 값을 수정할 수 있지만,

pointer안의 저장된 주소값을 바꿀 수는 없다!!

3.상수의 상수 포인터

int a=100;
    int b=200;
    const int* const pointer = &a;
    *pointer = 500;//불가능
    pointer = &b;//불가능

위의 두 개념을 합친 포인터 상수이다.

이 경우에는 역참조 연산자를 이용해 값을 수정할 수도 없고, 자기가 가진 주소값을 변경할 수도

없다. 두가지 기능을 모두 상수화 했다고 보면 된다.

*의 위치

위의 경우들이 일반적이지만, 가끔씩 이상항 경우가 있다.

int const* pointer;

이런 경우에는 어떤 식으로 처리될까?

상수화의 기준은 const와 *의 위치를 따른다.

따라서 이 경우에서는 const가 *앞에 위치한 1번의 경우와 같다고 볼 수 있다.


728x90

'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글

[C++기본] 19.문자  (0) 2021.09.17
[C++기본] 18.void 포인터  (0) 2021.09.02
[C++기본] 16.const, 상수  (0) 2021.08.31
[C++기본] 15.포인터와 배열  (0) 2021.08.30
[C++기본] 14.운영 체제와 포인터  (0) 2021.08.30