포인터란 무엇인가?
포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. C 언어에서 포인터는 메모리를 직접 제어할 수 있게 해주는 핵심 기능으로, 효율적인 프로그램 작성에 반드시 알아야 할 개념입니다.
포인터의 주요 특징
- 메모리 공간을 절약할 수 있습니다.
- 메모리 위치에 직접 접근하기 때문에 실행 속도가 빠릅니다.
- 메모리를 효율적으로 관리할 수 있으며, 동적으로 메모리를 할당하고 해제할 수 있습니다.
- 배열, 연결 리스트 등 다양한 자료구조와 함께 활용됩니다.
포인터의 선언과 초기화
먼저 다음 문장을 살펴보겠습니다.
int qty = 179;
이 변수는 메모리에서 다음과 같이 표현됩니다.

포인터 선언하기
아래 선언문에서 'p'는 정수형 변수의 주소를 저장하는 포인터 변수임을 의미합니다.
int *p;
포인터 초기화하기
포인터 변수는 주소 연산자(&)를 사용하여 초기화합니다.
int qty = 175;
int *p;
p = &qty;
위 코드에서 포인터 p에는 변수 qty의 메모리 주소가 저장됩니다.
포인터 배열(Array of Pointers)이란?
포인터 배열이란 여러 개의 주소, 즉 여러 개의 포인터를 하나로 모아놓은 집합을 의미합니다.
선언 방법
포인터 배열은 다음 형식으로 선언합니다.
datatype *pointername[size];
예를 들어 다음과 같습니다.
int *p[5];
이는 정수형 요소 5개의 주소를 저장할 수 있는 포인터 배열을 나타냅니다.
초기화 방법
포인터 배열은 '&' 연산자를 사용하여 초기화합니다.
int a[3] = {10, 20, 30};
int *p[3], i;
for (i = 0; i < 3; i++)
p[i] = &a[i]; /* 또는 p[i] = a + i; */값 접근하기
포인터 배열이 가리키는 실제 값에 접근할 때는 간접 참조 연산자(*)를 사용합니다.
for (i = 0; i < 3; i++)
printf("%d", *p[i]);
예제 프로그램 1: 정수형 포인터 배열
다음은 포인터 배열을 활용한 전체 프로그램입니다.
#include<stdio.h>
main() {
int a[3] = {10, 20, 30};
int *p[3], i;
for (i = 0; i < 3; i++)
p[i] = &a[i];
printf("elements of the array are \n");
for (i = 0; i < 3; i++)
printf("%d \t", *p[i]);
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
elements at the array are : 10 20 30
예제 프로그램 2: 문자열 포인터 배열
다음은 여러 문자열을 가리키는 포인터 배열의 예제입니다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *a[5] = {"one", "two", "three", "four", "five"};
int i;
printf("the strings are at locations:\n");
for (i = 0; i < 5; i++)
printf("%d\n", a[i]);
return 0;
}
실행 결과
위 프로그램을 실행하면 각 문자열이 저장된 메모리 주소가 출력됩니다.
The strings are at locations:
4210688
4210692
4210696
4210702
4210707
마무리 정리
포인터 배열은 여러 개의 데이터나 문자열을 효율적으로 관리할 수 있게 해주는 강력한 도구입니다. 주소 연산자(&)로 초기화하고, 간접 참조 연산자(*)로 값을 읽는다는 기본 원칙만 기억하면 다양한 상황에서 활용할 수 있습니다. 특히 문자열 처리 시에는 문자열 포인터 배열을 사용하면 2차원 배열보다 메모리를 더 효율적으로 사용할 수 있다는 장점이 있습니다.