C함수와 배열

배열 인자와 길이 전달

배열을 함수에 넘길 때 포인터로 바뀌는 규칙과 길이를 함께 넘겨야 하는 이유를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

c
int sum_array(const int values[], size_t length) {
    int sum = 0;
    for (size_t i = 0; i < length; i += 1) {
        sum += values[i];
    }
    return sum;
}

설명

  • 배열을 함수 인자로 넘기면 전체 배열이 복사되는 것이 아니라 첫 원소 주소로 바뀐 포인터가 전달됩니다.
  • 그래서 함수 안에서는 배열 전체 길이를 알 수 없으므로, 원소 수를 별도 인자로 함께 넘기는 것이 기본입니다.
  • 읽기 전용이라면 const를 붙여 함수가 원본을 바꾸지 않는다는 의도를 드러내는 편이 좋습니다.
  • 이 규칙을 이해해야 sizeof, 포인터, 배열이 왜 자꾸 함께 설명되는지 자연스럽게 보입니다.

짧은 예제

c
#include <stdio.h>
#include <stddef.h>

int sum_array(const int values[], size_t length) {
    int sum = 0;
    for (size_t i = 0; i < length; i += 1) {
        sum += values[i];
    }
    return sum;
}

int main(void) {
    int scores[] = {10, 20, 30, 40};
    size_t length = sizeof scores / sizeof scores[0];
    printf("%d\n", sum_array(scores, length));
    return 0;
}

빠른 정리

항목설명
배열 decay함수 인자로 가면서 첫 원소 포인터처럼 동작
길이 전달size_t length를 따로 넘기는 패턴이 기본
const 배열 인자함수가 배열 내용을 수정하지 않음을 표현
인덱스 접근values[i]는 포인터 연산의 문법적 편의형
호출 쪽 sizeof배열 길이는 보통 호출하는 쪽에서 계산

주의할 점

함수 안에서 sizeof(values) / sizeof(values[0])를 쓰면 전체 길이가 아니라 포인터 크기를 기준으로 계산될 수 있습니다.