728x90
- const
상수화 : 숫자가 변하지 않음
l-value : 변수
r-value : 상수- const라는 키워드는 변수를 '상수화' 시켜주는 역할을 수행한다.
하지만 일반적으로 사용하는 진짜 상수(10, 20,...)처럼 변화하는 것은 아니다. 문법적으로 상수화를 지켜주는 것이지 진짜 상수는 아니다.
- const라는 키워드는 변수를 '상수화' 시켜주는 역할을 수행한다.
- const와 포인터
- 포인터의 두 가지 상황(역할)
1. 포인터 자체가 가리킬 변수의 주소를 변경할 수 있다.
2. 포인터가 가리킨 변수의 값을 변경할 수 있다. - const - 포인터
const 포인터는 "포인터가 가리키는 원본 변수가 상수화 된 것" 이다.
- 포인터의 두 가지 상황(역할)
int a = 0;
int b = 0;
const int* pConstInt = &a;
pConstInt = &b; // 가능
*pConstInt = 100; // 불가능!!
-
- const 포인터는 const가 앞에 있는 * '포인터'를 지칭하여 가리키는 변수를 상수화 시킨 것이다.
따라서 포인터가 가리킬 대상을 변경할 순 있지만 포인터가 가르킨 변수 값을 변경할 순 없다. - 포인터 - const
포인터 const는 "포인터 변수 자체가 상수화 된 것"이다.
- const 포인터는 const가 앞에 있는 * '포인터'를 지칭하여 가리키는 변수를 상수화 시킨 것이다.
int a = 0;
int b = 0;
int* const pIntConst = &a;
*pIntConst = 400; // 가능
pIntConst = &b; // 불가능 !!
-
- 포인터 const는 const가 앞에 있는 pIntConst '변수'를 지칭하여 변수 자체가 상수화 된 것이다.
따라서 포인터가 가리키는 변수의 값은 변경할 수 있지만, 포인터가 가리킬 변수를 변경할 순 없다. - const와 포인터를 적절한 위치에 사용하면 const-포인터와 포인터-const를 모두 사용할 수도 있다.
const int* const pConstIntConst = nullptr;
이는 초기화 시 가리킨 대상만 가리킬 수 있고, 가리키는 원본을 수정할 수 없다.
- 포인터 const는 const가 앞에 있는 pIntConst '변수'를 지칭하여 변수 자체가 상수화 된 것이다.
- const 포인터를 실제로 사용하는 예시(경우)
void Output(const int *pI) {
int i = *pI;
// 물론 const 포인터를 강제로 수정할수도 있긴 함.
int * pInt = (int*)pI;
*pInt = 1000;
}
int main(){
int a = 100;
Output(&a);
return 0;
}
const 포인터를 사용하는 예시를 하나 들어보자면, 함수의 매개변수로써 사용하는 경우가 있다.
회사 내의 데이터가 너무 크거나 보안이 중요해서 직접 데이터를 전달/복제하지 못하는 경우, 데이터의 저장 주소를 전달받아 데이터의 변형을 방지하는 방법이 있다.
함수를 통해 데이터를 받을 때 매개변수를 const 포인터로 받는 방법이다.
즉, 회사 프로그램의 코드에서 이와 같은 포인터 매개변수를 본다면 "아~ 데이터의 주소만 읽고 데이터를 변형시키진 않는구나~"라고 소스코드를 이해할 수 있다.
(단, 데이터를 절대 못 바꾸는 것은 아니다. const 포인터를 받아 강제로 수정할 수도 있지만 데이터를 변형시킬 생각이 없다는 제작자의 의도를 전달하기 위함이다.)
- void 포인터
void* pVoid = nullptr;- 1. 원본의 자료형을 정하지 않는다.
- 2. 어떠한 타입의 변수던지 모든 주소를 저장 가능
void 포인터는 주소를 해석할 때 해석의 단위가 정해지지 않은 포인터이다.
따라서 어떤 변수의 주소든지 모두 저장이 가능하다.
int a = 0;
float f = 0.f;
double d = 0.;
long long ll = 0;
pVoid = &a;
pVoid = &f;
pVoid = &d;
pVoid = ≪
-
- 3. 역참조 불가능
*pVoid; (x) - 4. 주소 연산 불가능
pVoid + 1; (x)
- 3. 역참조 불가능
- 포인터의 중요 개념
원본 데이터가 실제로 어떻게 사용되고 있는지는 포인터와 무관하다.
포인터는 오로지 선언 시점 때, 해당 포인터에 선언된 '자료형'이 무엇인지에 따라 주소에 접근하는 방법과 분석 방법, 주소 연산 방법이 결정되는 것이다.
따라서 어떠한 메모리 공간에 의미 있는 데이터를 저장시켰을 때 그 데이터대로 온전히 사용하려면 데이터 타입과 포인터 타입이 정확히 매칭 되도록 선언해야 한다.
ex) int num = 100;
int* pNum = #
728x90
'📚책읽기' 카테고리의 다른 글
[C++] 문자열 함수(wcslen, wcscat_s, wcscmp), 함수 구현 과제 (0) | 2022.03.13 |
---|---|
[C++] 문자, 문자열(char, wchar_t, const wchar_t*) (0) | 2022.03.09 |
[C/C++] 포인터 이해 확인 문제 (0) | 2022.03.07 |
[C/C++] 포인터 변수, 포인터 배열 (0) | 2022.03.07 |
[C/C++] 메모리 영역, 변수-2 (정적변수/외부변수), 분할구현 (0) | 2022.03.02 |