C 언어에서 포인터 배열이란?
예제를 살펴보기 전에, C 프로그래밍 언어에서 포인터 배열(array of pointers)이 어떤 개념인지 먼저 이해해 보겠습니다.
문자열을 가리키는 포인터 배열
포인터 배열이란 각 요소가 문자열의 시작 주소(base address)를 가리키는 포인터로 구성된 배열입니다.
다음과 같이 선언하고 초기화할 수 있습니다.
char *a[ ] = {"one", "two", "three"};여기서 각 요소는 다음과 같이 동작합니다.
a[0]: 문자열 "one"의 시작 주소를 가리키는 포인터
a[1]: 문자열 "two"의 시작 주소를 가리키는 포인터
a[2]: 문자열 "three"의 시작 주소를 가리키는 포인터
포인터 배열의 장점
문자열을 가리키는 포인터 배열의 장점은 다음과 같습니다.
2차원 문자 배열과 달리, 포인터 배열을 사용하면 저장 공간에 고정된 메모리 크기를 할당할 필요가 없습니다.
각 문자열이 필요한 만큼의 바이트만 차지하므로 메모리 공간의 낭비가 없습니다.
예제 1: 문자열 값과 주소 함께 출력하기
다음은 문자열을 가리키는 포인터 배열의 값을 출력함과 동시에 각 문자열의 주소도 함께 출력하는 C 프로그램입니다.
#include<stdio.h>
#include<string.h>
void main(){
// 문자열과 포인터, 반복문 변수 선언 //
int i;
char *a[5]={"One","Two","Three","Four","Five"};
// for 문으로 각 문자열 위치의 값 출력 //
printf("The values in every string location are : \n");
for(i=0;i<5;i++){
printf("%s\n",a[i]);
}
// for 문으로 각 문자열 위치의 주소 출력 //
printf("The address locations of every string values are : \n");
for(i=0;i<5;i++){
printf("%d\n",a[i]);
}
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
The values in every string location are: One Two Three Four Five The address locations of every string values are: 4210688 4210692 4210696 4210702 4210707
참고로, 출력되는 주소 값은 프로그램을 실행하는 시스템 환경과 실행 시점에 따라 달라질 수 있습니다. 주소는 단순히 메모리상의 위치를 나타낼 뿐이며, 인접한 문자열들이 메모리에 순차적으로 배치되는 것을 확인할 수 있습니다.
예제 2: 포인터로 문자열 한 글자씩 출력하기
이번에는 또 다른 예제를 살펴보겠습니다. 아래 프로그램은 포인터를 이용하여 문자열의 내용을 한 글자씩 이동하면서 출력하는 방법을 보여줍니다.
#include<stdio.h>
#include<string.h>
void main(){
// 문자열과 포인터 선언 //
char string[15]="TutorialPoint";
char *pointer = string;
// 포인터를 사용하여 문자열 출력 //
printf("The string is : ");
while(*pointer!='\0'){
printf("%c",*pointer);
pointer++;
}
}여기서 *pointer는 현재 가리키고 있는 단일 문자(char)이므로, 서식 지정자로 %c를 사용해야 합니다. 포인터를 한 칸씩 증가(pointer++)시키며 널 문자('\0')를 만날 때까지 반복하면 문자열 전체가 순서대로 출력됩니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
The string is: TutorialPoint