43 – 포인터

드디어 올 것이 왔습니다. (빨라!)

포인터란 메모리의 주소를 값으로 갖는 변수를 말합니다. 메모리의 주소값은 하드웨어에 의해 정해지는 값이기 때문에 하드웨어를 제어하는 기능을 하게 됩니다. 이런 하드웨어를 제어하는 대부분의 시스템 소프트웨어들은 C언어로 개발하게 됩니다.

변수가 선언된 프로그램은 실행중에 메모리의 일정 영역에 해당 변수가 생성된다. 그런데 메모리에는 각 부분을 구분하기 위해 주소가 부여되어 있으므로 변수에는 대응되는 주소가 반드시 존재한다. C언어에서는 변수의 주소를 확인하려면 변수 이름 앞에 엠퍼샌드(&)를 붙이면 확인이 가능하다. 이를 아래의 예제와 같이 3개의 요소를 갖는 float형 배열 arr에 대한 주소를 출력하는 프로그램으로 확인할 수 있다.



C언어에서는 주소를 저장하는 변수를 사용할 수 있는데, 이러한 변수를 포인터 변수라고 한다. 포인터 변수를 선언하려면 다음과 같이 변수 이름 앞에 에스테리스크(*)를 붙이면 포인터 ㅂ녀수가 도니다.

데이터형 *변수이름

아래의 예시와 같이 포인터 변수를 선언하면 되는데, k 값의 경우에는 int형 데이터를 저장하고 있는 메모리 주소를 저장하는 변수고, l은 float형 데이터를 저장하고 있는 메모리 주소를 저장하는 포인터 변수다.

int *k;

float *l;

포인터 변수에 대한 개념을 아래의 예시 프로그램을 통해 다시 살펴보도록 하겠다.


i변수의 주소가 0x00001000이라고 할 때, 포인터 변수 ptr은 해당되는 주소를 가지고 있는 것이다. 알래의 그림은 좀 더 쉽게 설명하기 위해 그린 그림이다.


이런 식으로 ptr변수는 i변수의 주소를 직접 가지고 있기 때문에 i를 ptr로 제어할 수 있는 것이다.

그러나, 아래에 보면 선언문이 아닌 곳에서 에스테리스크를 붙이는 것을 볼 수 있는데, 이는 이 포인터 변수가 가리키는 곳의 내용을 의미하게 된다. 그래서 (*ptr)++을 실행할 때, ptr이 가리키는 변수 i값에 대해서 ++연산을 하게 된 것이다. 그래서 출력한 값이 11이 된 것이다.

포인터에서 중요하게 생각할 것은 다음과 같다.

  1. 변수 선언문에 붙어있는 에스테리스크는 포인터 변수를 선언할 때 사용된다.
  2. 선언문이 아닌 곳에 붙어있는 에스테리스크는 포인터 변수가 가리키는 실제 값을 가리킨다.
  3. 앰퍼센트가 붙어있으면 해당 변수의 주소를 확인할 수 있다.

일단 여기까지가 포인터에 대한 기본 정리이다.