C포인터와 메모리

포인터와 배열의 관계

배열이 함수 인자로 넘어가면 포인터처럼 취급되는 C의 array decay 개념을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int numbers[3] = {10, 20, 30};
int *ptr = numbers;

printf("%d %d\n", numbers[0], *(ptr + 1));

설명

  • 배열 이름은 많은 문맥에서 첫 원소를 가리키는 포인터처럼 변환됩니다.
  • 그래서 numbers[i]*(numbers + i)는 같은 원소를 가리키는 표현으로 읽을 수 있습니다.
  • 함수 매개변수에서 int arr[]는 사실상 int *arr처럼 동작합니다.
  • 이 때문에 함수 안에서는 sizeof(arr)로 전체 배열 길이를 알 수 없습니다.

짧은 예제

c
#include <stdio.h>

void print_numbers(const int numbers[], int length) {
    for (int i = 0; i < length; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
}

int main(void) {
    int values[] = {2, 4, 6, 8};
    int length = (int)(sizeof(values) / sizeof(values[0]));
    print_numbers(values, length);
    return 0;
}

빠른 정리

항목설명
배열 이름첫 원소 주소처럼 사용되는 경우가 많음
arr[i]*(arr + i)와 같은 의미
함수 인자배열 길이 정보가 함께 넘어가지 않음
const int arr[]읽기 전용 배열 인자 의도 표현
길이 전달배열과 함께 별도 인자로 넘겨야 함

주의할 점

함수 안에서 sizeof(arr)를 배열 길이라고 믿으면 거의 항상 틀립니다. 이미 포인터로 변환되었기 때문입니다.