배열을 함수에 전달하는 기본 구조
int arr[5] = {5, 6, 7, 8, 9};
fun(arr);
이 코드를 보면 우리가 arr을 fun() 함수에 전달했다고 말하지만, 사실은 "배열 전체"를 넘긴 것이 아닙니다.
❗ 중요한 사실: 배열은 절대 통째로 함수로 "복사되어" 넘어가지 않습니다.
배열의 이름 arr은 무엇인가?
arr은 배열의 이름인데, 이름 그 자체가 배열의 첫 번째 원소의 주소를 나타내는 포인터입니다.
즉, 다음이 성립합니다:
arr == &arr[0] // 배열의 시작 주소
따라서 fun(arr);는 실제로는
fun(&arr[0]); // 배열의 첫 번째 원소 주소를 전달
이라는 의미입니다.
함수 쪽에서 받는 방법
void fun(int *p)
배열의 주소가 넘어오기 때문에, 받는 쪽에서는 반드시 포인터로 받아야 합니다.
- 배열 이름은 포인터처럼 행동하므로
- 함수 매개변수에서도 포인터로 받아야 해당 배열에 접근할 수 있습니다
함수 내부에서 원소 접근
void fun(int *p) {
// p는 &arr[0]과 같음
// p[0] == arr[0] == 5
// p[1] == arr[1] == 6
// ...
// *(p + i) == arr[i]
}
함수 내부에서 p, p+1, p+2 식으로 접근하면 배열의 각 원소에 접근할 수 있습니다.
왜 배열을 직접 넘기지 못하나요?
💡 배열은 포인터로 구성된 자료구조입니다.
- C 언어는 배열 전체를 값으로 전달하는 기능이 없습니다.
- 대신, 배열의 시작 주소만 전달됩니다.
- 그래서 배열을 넘긴다는 것은 실제로는 배열이 있는 메모리의 주소를 넘기는 것입니다.
요약
배열을 함수에 넘길 수 있나요? | 전체를 넘기는 건 불가능. 주소(포인터)만 넘길 수 있음 |
배열을 넘기면 실제로 무엇이 전달되나요? | 배열의 시작 주소 (포인터) |
함수에서 받는 방법은? | 포인터 변수로 받음 (int *p) |
함수 내에서 어떻게 접근하나요? | p[i] 또는 *(p + i) |
결론
- 배열의 이름은 주소이다 → 배열 자체가 아니라 주소를 넘긴다
- fun(arr)은 fun(&arr[0])과 같다
- 따라서 함수에서는 반드시 포인터로 받아야 한다
- 포인터는 배열 원소를 차례로 접근할 수 있게 한다 (p + i 형태)
- 배열은 내부적으로 포인터 연산으로 만들어진 자료구조이기 때문에 배열 = 포인터라고 생각하면 쉽다
'C' 카테고리의 다른 글
포인터 배열 (0) | 2025.06.13 |
---|---|
다중 포인터 (0) | 2025.06.13 |
배열과 포인터 (0) | 2025.06.13 |
Call by Value vs Call by Address (0) | 2025.06.13 |
포인터의 크기와 자료형이 중요한 이유 (0) | 2025.06.13 |