C 언어
Cpp 언어
Kotlin
Android App
알고리즘
Git/CI/CD
Const에 대해
const는 변수가 상수임을 알려준다. 
 
 
하지만 포인터 변수에 const가 붙은 경우, 그 의미를 혼동할 가능성이 있다.
 
const 포인터 변수는, 
그 변수 자체가 메모리 주소를 바꿀 수 없는 것인지, 
아니면 참조하는 값을 변경할 수 없는 것인지 헤맬 경우가 많다.
 
이러한 경우 확실히 구분할 수 있는 방법은 아래와 같다.
const가 * 와 변수 네임 심볼 사이에 있느냐, 외부에 있느냐만 구분해주면 정확히 알 수가 있다.
만약 외부에 있다면, 해당 포인터 변수는 참조하는 값을 변경할 수 없으며,
만약 사이에 있다면, 포인터 변수가 가리키는 메모리 주소를 변경할 수 없다.
 
아래의 예를 통해 자세히 알아보도록 하자.

const int *p = &n; //---(1)
int const *p = &n; //---(2)
int * const p = &n; //---(3)
const int * const p = &n; //---(4)


(1)번 예시)
const는 *와 p 사이에 있지 않다. 그러므로 const의 대상은 *p 그대로 된다.
따라서, p 자체가 가리키는 메모리 주소는 변경할 수 있어도, p의 참조대상인 *p는 변경할 수 없다.
 
(2)번 예시)
위와 마찬가지로, const는 *와 p 사이에 있지 않다. 그러므로 const의 대상은 *p 그대로 된다.
 
(3)번 예시)
①, (2)와는 다르게 const가 *와 p 사이에 있다. 그러므로 const의 대상은 p가 된다.
따라서, p 자체가 가리키는 메모리 주소를 변경할 수 없다. 그러나 p의 참조대상인 *p는 변경 가능하다.
 
(4)번 예시)
여기서는 const가 두 번 등장한다. 한번은 *와 p 사이에 있으며, 다른 한번은 *와 p 외부에 있다.
그러므로, p는 가리키는 메모리 주소와 참조대상 모두를 변경할 수 없다.
 
결과적으로, const가 *p 를 수식하느냐, p를 수식하느냐에 따라 달라지는 것이다.