(C++) Pointer 2

포인터 변수 자료형

포인터 변수를 선언할때 항상 자료형을 같이 선언한다.

int num = 10;
char ch = 'c';
int *ptr1 = #
char *ptr2 = &ch;

여기서의 int , char 처럼 변수의 타입을 붙인다.

매번 붙이다 보니 당연하게 생각하고 있었는데… 알고보니 심오한 이유가 있었다…

붙이는 이유는, 변수의 자료형이 포인터가 얼마만큼의 크기를 읽어야 할지 정해주기 때문 이다.

이 부분은 아직 다 이해를 못해서 더 알아봐야 할 것같다. 일단 이 정도만 작성해놓고…

자료형에 따라서 메모리상에서의 크기가 다른데 비해, 포인터 변수는 타입에 관계없이 모두 4바이트의 크기를 가진다.

배열과 포인터

배열은 인덱스를 통해 접근할 수 있지만, 포인터를 이용해서도 접근할 수 있다.

그러기 위해 몇 가지를 알아야 한다.

  1. 배열명은 배열의 첫 번째 항목을 가리키는 포인터 상수이다.
int array[4] = {4, 3, 2, 1};

array == &array[0];
*array == array[0];

즉, 위에서 array는 array[0] 의 주소값을 담고 있다.

  1. 배열 포인터에 상수를 더해 항목을 이동 할 수 있다.
array + 2 == &array[2];
*(array + 2) == array[2];

array[0] 에서 array[2] 로 이동하였다.

이때 2를 더하는 것은 일반적인 정수 연산과는 다른 것.

포인터 변수에서 정수n을 더하는 것은

저장된 주소 + (자료형의 메모리 크기 * n)

과 같다.

int 형의 메모리 크기가 4바이트 이므로 주소값을 4 * n 만큼 이동하게 되어 4바이트 단위로 구성되어있는 배열의 항목을 이동 할 수 있다.

이때 항목을 이동하면서 원래의 주소값에 변화가 생기게 되므로, 포인터 변수에 덧셈, 뺄셈 연산을 수행하면, 그 자료형의 크기만큼 주소값을 더하거나 빼준다.

즉, 다음 항목에 접근하고 싶을 때 포인터 변수에 덧셈/뺄셈을 하면 주소값도 그에 따라 덧셈/뺄셈을 하게 되는 것이다.

이를 토대로 배열에서 포인터를 사용한다.