11-2.포인터 배열

11-2-가.정의

포인터 배열(Array of Pointer)이란 요소가 포인터형인 배열이다. T형이 있을 때 T형 포인터를 선언할 수 있고 T형 배열도 선언할 수 있으므로 T형 포인터 배열도 선언할 수 있다. 예를 들어 크기 5의 정수형 포인터 배열을 선언하고 싶다면 다음과 같이 선언한다.

 

int *arpi[5];

 

이 선언문에 사용된 *와 [ ]는 둘 다 구두점이다. *가 앞쪽에 있으므로 arpi는 먼저 정수형 포인터가 되고 다음으로 [ ]에 의해 그런 포인터 변수 5개를 모아 배열을 선언하게 된다. arpi 배열의 요소인 arpi[0]~arpi[4]는 정수형 포인터 변수와 동등한 자격을 가지므로 정수형 변수나 정수형 배열을 가리킬 수 있다. arpi라는 하나의 이름 아래에 포인터 변수 다섯 개가 모여 있다는 것 외에 특별한 점은 없고 별 다른 주의 사항도 없다.

현실적으로 실수형이나 정수형의 포인터 배열이 필요한 경우는 그리 흔하지 않다. 포인터 배열이 사용되는 가장 흔하고 쉬운 예는 문자형 포인터 배열이며 가장 실용적인 예는 구조체 포인터 배열이다. 문자형 포인터가 하나의 문자열을 표현할 수 있으므로 문자형 포인터 배열은 곧 문자열 배열이 되는 셈이다. 다음 예는 포인터 배열로 문자열 배열을 선언하는 예이다.

 

: PointerArray

#include <Turboc.h>

 

void main(void)

{

     char *arps[]={"고양이","개","오랑우탄","돼지","지렁이"};

     int i;

 

     for (i=0;i<5;i++) {

          printf("%s\n",arps[i]);

     }

}

 

arps라는 포인터 배열에 다섯 개의 문자열을 정의한 후 이 문자열을 화면으로 출력했다. 나중에 다시 살펴보겠지만 이 초기식에 사용된 "고양이", "개" 같은 문자열 상수는 문자열의 시작 번지를 가리키는 포인터 상수인데 arps의 각 요소들은 이 번지들로 초기화된 것이다. arps가 메모리에 구현된 모양을 그려 보면 다음과 같다.

각 문자열들은 메모리상에 흩어져서 존재하지만 이 문자열들의 번지를 포인터 배열로 가지고 있으므로 위치에 상관없이 이 문자열들에 대해 반복적인 처리가 가능해진다. 이렇게 만들어진 문자열 배열을 Ragged 배열이라고 하는데 개별 문자열의 길이가 각각 달라도 낭비되는 메모리가 없다. 포인터의 개념이 없는 베이직에서는 직사각형의 배열만 만들 수 있으며 이런 배열은 꿈도 못꾼다.