[C++] 상수와 포인터

Artiper
|2023. 1. 24. 19:26

상수 변수 선언

const int value = 5;


포인터가 상수 변수에 접근하여 역참조하는 것은 허용되지 않는다.
const int value = 5;
int ptr = &value; => compile error
*ptr = 6; // 6으로 바뀌긴 하겠지만, 위 라인에서 에러가 날 것이다.




상수를 가리키는 포인터 (Pointer to const value)

상수를 가리키는 포인터는 상수 변수를 선언하듯이 const를 붙이면 된다.
(상수를 가리키는 포인터는 상수 변수의 주소를 가리키는 (non-const)포인터

const int value = 5;
const int* ptr = &value; // 상수를 가리키는 포인터 선언. (pointing to a "const int")
*ptr = 6; // 허용되지 않음.

 

상수를 가리키는 포인터는 상수가 아닌 변수를 가리킬 수 있다. 단순히 값을 상수취급 할 뿐이다. 그래서 값에 접근할 떄 변수가 const로 정의되어있는지는 관계가 없다.

int value = 5;
const int* ptr = &value;
value = 6;

그러나 이것은 불가능하다.

int  value = 5;
const int* ptr = &value;
*ptr = 6; // 상수를 가리키는 포인터는 값을 상수취급하게 되므로 값을 역참조해서 바꿀 수는 없다.


상수 포인터 (Const Pointer)

 상수 포인터는 즉, 포인터를 상수값으로 들고 있는 것이다. 그래서 상수 포인터는 초기화 후에 가리키는 주소를 변경할 수 없다.

상수 포인터를 선언하는 방식은 자료형 뒤에 const 키워드를 붇이면 된다.

int value = 5;
int* const ptr = &value;


일반 상수 변수처럼 상수 포인터는 선언 시 초기화 해야하며, "항상 같은 주소"를 가리킨다.

int value = 1;
int value = 2;

int* const ptr = &value1;
ptr = &value2; // 허용되지 않음. const pointer의 주소값은 바뀔 수 없다.


포인터가 상수일 뿐, 가리키는 변수는 상수가 아니므로 포인터를 역참조하여 값 변경 가능.



상수를 가리키는 상수 포인터

int value = 5;
// const int* 변수명 : 상수를 가리키는 포인터의 형태
// int* const 변수명 : 상수 포인터

const int* const ptr = &value; // 상수를 가리키는 상수 포인터

 


const GLchar* const* 

OpenGL 공부하다 나온 괴랄한 것이다. (const GLchar* const*)&codePtr 

- 우선 필요한 배경지식은 shader코드를 여러 개 가질 수 있다.

const GLchar* const*

const GLchar* : GLchar 타입의 상수를 가리키는 상수 포인터
GLchar* const : GLchar 변수를 가리키는 상수 포인터
const GLchar* const : GLchar 타입의 상수를 가리키는 상수 포인터
const GLchar* const* : GLchar타입의 상수를 가리키는 상수 포인터에 대한 포인터.

즉, 상수 포인터들을 배열로서 가지게 될 수도 있게 되는 것 같다. (설명은 잘 못하겠지만, 우선 이렇게 하면 여러개의 shader코드를 가질 수 있게 될 것이다. 공부를 하면 수정가능 할 듯.

 

출처
https://boycoding.tistory.com/206
https://www.sololearn.com/discuss/2608620/this-parameter-is-confusing-me