C

배열을 함수에 전달할때 동작방식

1space 2025. 6. 13. 19:13

 

배열을 함수에 전달하는 기본 구조

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