기본 패턴
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])를 쓰면 전체 길이가 아니라 포인터 크기를 기준으로 계산될 수 있습니다.