Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 포인터를 활용해 배열 요소의 합 계산하는 방법 완벽 정리

포인터(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)의 원리만 이해하면 배열과 포인터를 자유롭게 다룰 수 있습니다.