포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. C 언어에서 포인터는 배열을 효율적으로 다루는 데 필수적인 개념이며, 이 글에서는 포인터의 기본 개념부터 배열 요소의 합을 계산하는 실전 예제까지 단계별로 살펴보겠습니다.
포인터란 무엇인가?
포인터는 변수의 값이 아닌, 그 변수가 저장된 메모리 주소를 담고 있는 변수입니다. 다음 예시를 통해 이해해 보겠습니다.
int qty = 179;
위 코드에서 변수 qty는 179라는 값을 가지며, 메모리상의 특정 주소에 저장되어 있습니다. 포인터는 바로 이 주소값을 참조할 수 있습니다.
포인터 선언하기
포인터를 선언하는 기본 문법은 다음과 같습니다.
int *p;
여기서 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]);포인터로 배열 요소의 합 구하는 C 프로그램
다음은 포인터를 활용하여 배열 요소의 합을 계산하는 전체 C 프로그램입니다. 동적 메모리 할당 함수 malloc()을 사용하여 사용자가 입력한 크기만큼의 배열을 생성합니다.
//sum of array elements using pointers
#include <stdio.h>
#include <malloc.h>
void main(){
int i, n, sum = 0;
int *ptr;
printf("Enter size of array : \n");
scanf("%d", &n);
ptr = (int *) malloc(n * sizeof(int));
printf("Enter elements in the List \n");
for (i = 0; i < n; i++){
scanf("%d", ptr + i);
}
//calculate sum of elements
for (i = 0; i < n; i++){
sum = sum + *(ptr + i);
}
printf("Sum of all elements in an array is = %d\n", sum);
}코드 설명
malloc(n * sizeof(int)): 사용자가 입력한 크기n만큼 정수형 메모리를 동적으로 할당합니다.scanf("%d", ptr + i): 포인터 산술 연산을 이용해 각 위치에 값을 직접 입력받습니다.*(ptr + i): 간접 참조 연산자로 각 배열 요소의 실제 값을 읽어와 합계에 더합니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter size of array: 5 Enter elements in the List 12 13 14 15 16 Sum of all elements in an array is = 70
마무리
이처럼 포인터를 활용하면 배열 요소에 인덱스 없이도 직관적으로 접근할 수 있으며, 동적 메모리 할당과 결합하면 실행 시점에 유연하게 배열 크기를 조절할 수 있습니다. 포인터 산술(ptr + i)과 간접 참조(*ptr)의 원리만 이해하면 배열과 포인터를 자유롭게 다룰 수 있습니다.