// 포인터 변수 앞의 자료형은 특정 변수의 주소에서 얻은 값을 해석하는 단위이다.
// 다음의 경우는 short(2byte) 타입의 변수를 int 즉, 4바이트의 단위로 값을 해석하겠다는 의미이다.
short s = 100;
int* ptr = (int*)&s;
// 배열이란 메모리가 연속적으로 배치되어있는 자료구조이다.
// 포인터 배열의 경우 포인터를 1증가시키면 실질적으로는 포인터 변수의 자료형의 크기에 따라 주소값이 증가한다.
// 즉 char형일 경우에는 1byte, short 형일 경우에는 2byte, int 형일 경우에는 4byte 씩 증가한다.
int arr = {1, 2, 3, 4, 5};
int* ptr = arr; // 배열의 이름은 해당 배열의 시작 주소를 나타냄(arr = arr[0])
ptr += 1; // int 형이므로 4byte가 증가하여 다음 인덱스(arr[1])를 가리키게 됨
// const 포인터
// const란 상수화를 의미하며 해당 키워드로 선언된 변수의 경우 값의 변경이 불가능하다.
// 다만 절대적인 것은 아니다.
const int c = 10;
c = 11; // 오류
// const 키워드를 사용하여 포인터를 선언할 수 있으며 const 키워드의 위치에 따라 그 의미가 달라진다.
int a = 10;
const int* ptr = &a; // 포인터 변수 ptr이 가리키는 주소의 값이 상수화됨. 즉, ptr이 가리키는 주소의 값을 변경할 수 없음.
int* const ptr = &a; // 포인터 변수 ptr 자체가 상수화됨. 즉, ptr이 가리키는 주소를 변경할 수 없음.
// const 포인터 예시
// const 포인터는 주로 어떠한 함수에 전달하고자 하는 데이터의 크기가 매우 크거나 유일해야 할 경우
// 호출 스택에서의 비효율적인 복사 및 삭제 또는 원본 값의 변경이 발생하는 것을 막기 위해 사용한다.
void output(const int* p)
{
int i = *p; // 포인터 변수에 저장되어 있는 값을 가져올 수는 있음.
*p = 100; // 오류 : const 키워드로 인해 포인터 변수 p로 원본을 수정할 수 없음.
}
int a = 0;
output(&a);