38.1 포인터에 할당된 메모리를 배열처럼 사용하기

포인터를 배열처럼 사용하는 방법은 간단합니다. 포인터에 malloc 함수로 메모리를 할당해주면 됩니다. 다음 내용을 소스 코드 편집 창에 입력하세요.

  • 자료형 *포인터이름 = malloc(sizeof(자료형) * 크기);

pointer_like_array.c

#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    int *numPtr = malloc(sizeof(int) * 10);    // int 10개 크기만큼 동적 메모리 할당

    numPtr[0] = 10;    // 배열처럼 인덱스로 접근하여 값 할당
    numPtr[9] = 20;    // 배열처럼 인덱스로 접근하여 값 할당

    printf("%d\n", numPtr[0]);    // 배열처럼 인덱스로 접근하여 값 출력
    printf("%d\n", numPtr[9]);    // 배열처럼 인덱스로 접근하여 값 출력

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}

실행 결과

10
20

int *numPtr = malloc(sizeof(int) * 10);과 같이 int 크기에 10을 곱하여 동적으로 메모리를 할당합니다(sizeof(int)를 곱하지 않으면 배열처럼 사용할 수 없습니다). 그리고 배열처럼 [ ] 안에 인덱스를 지정하여 값을 할당하거나 가져올 수 있습니다. 즉, 배열과 메모리가 할당된 포인터는 생성 방법만 다를 뿐 값을 다루는 방법은 같습니다.

  • 포인터[인덱스]
int numArr[10];                           // int형 요소 10개를 가진 배열 생성
int *numPtr = malloc(sizeof(int) * 10);   // int 10개 크기만큼 메모리 할당

numArr[0] = 10;    // 배열을 인덱스로 접근하여 값 할당
numPtr[0] = 10;    // 포인터를 인덱스로 접근하여 값 할당

free(numPtr);   // 메모리 해제

단, 배열 numArr은 한 번 선언하면 끝이지만 포인터 numPtrmalloc 함수로 메모리를 할당했기 때문에 free함수로 해제해줍니다.

*numPtr처럼 포인터를 역참조한 것과 numPtr[0] 인덱스 0에 접근한 것은 같은 값을 가져옵니다. 그리고 numPtr[1]*(numPtr + 1)도 같은 값을 가져오는데 *(numPtr + 1)와 같이 포인터에 값을 더하는 방식을 포인터 연산이라고 하며 'Unit 59 포인터 연산 사용하기'에서 자세히 설명하겠습니다.

그림 38‑1 포인터를 배열처럼 사용