본문 바로가기
공부/C, C++

[C] const 와 포인터

by 김샤랑 2022. 1. 4.

[C] const와 포인터


 

지난 포스팅에서 const와 포인터에 대해 알아보았다. 이제 그 둘의 관계에 대해 조금 더 알아보고자 한다.

기존에 배웠던 것을 떠올려보자.

 

int a = 0;
int* pInt = &a;  //pInt가 a의 주소값을 가리키고 있다.

*pInt = 1;       // a의 값이 1로 바뀌었다.
pInt = nullptr;  // pInt가 a를 가리키지 않고 null을 가리키도록 바뀌었다.

 

여기까지는 잘 이해했을 거라고 생각한다.

포인터는 가리키는 변수의 값을 바꿀 수도 있고, 가리키는 것의 방향도 바꿀 수 있다.


- const 포인터

int b = 0;
const int* pConstInt = &a;  //a 주소값을 가리킨다.

*pConstInt = 100;    //error
// 포인터변수 자체가 상수가 아니라 가리키고 있는 a가 상수여서
// a의 값을 바꿀 수 없기에 에러가 발생한다(실행할 수 없는 코드)

pConstInt = &b;  //b의 주소값을 가리킨다.

 

const가 *을 수식 중 => 포인터가 가리키는 원본을 상수화 한다.


- 포인터 const

int* const pIntConst = &a;

*pIntConst = 400; // a의 값이 400으로 바뀐다.

pIntConst = &b;   // error,
// const는 포인터 변수 자체를 가리켜서 a를 가리키는 것을 b로 바꾸려고 할 때 오류가 발생한다.

 

 const가 포인터 변수를 수식 중 => 포인터가 가리키고 있다는 것을 상수화 한다.


- const const

const 위치에 따라서 상수화를 할 수 있는 방법이 두 가지가 생긴다.

이것을 두 개 두 개 동시에 사용하면 두 개 다 상수화 할 수 있다.

 

//초기화 시 가리킨 대상만 가리킴, 가리키는 원본을 수정 할 수 없음
const int* const pConstIntConst = nullptr;

- 문제

int a = 0;
const int* pInt= &a;

a = 100;

 

이 코드에는 문제가 있을까?

정답은

더보기

No다. 문제없이 잘 작동한다. 

 

이유는 스스로 생각해보자. 기억이 안 난다면 복습!

더보기

const는 해당 포인터가 a의 변수를 바꾸는 기능을 상수화 한것이지, a 자체가 상수인 것이 아니다. 그래서 a = 100; 하는 건 위의 const와 아무런 관련이 없다.

 

 

ㅎㅎ 사실 문제 처음 봤을 때 틀렸다...

 

'공부 > C, C++' 카테고리의 다른 글

[C] wchar_t 함수 ( wcslen( ), wcscat_s( ) )  (0) 2022.01.09
[C] 문자열, wchar_t  (0) 2022.01.09
[C] const, const 값 바꾸기  (0) 2022.01.04
[C] 포인터 Pointer  (0) 2022.01.03
[C] 구조체  (0) 2022.01.02

댓글