기본 패턴
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)를 배열 길이라고 믿으면 거의 항상 틀립니다. 이미 포인터로 변환되었기 때문입니다.