Channi Studies

[C++] 함수에 배열을 매개변수로 사용할 때 (Passing Arrays To Functions) 본문

C++/함수 (Function)

[C++] 함수에 배열을 매개변수로 사용할 때 (Passing Arrays To Functions)

Chan Lee 2023. 12. 17. 22:59

Intro

 

C++에서 배열을 함수에 전달할 때 다음과 같은 형태로 작성하곤 합니다:

void print_array(int numbers []);

하지만 여기에는 주의할 점이 있습니다.

 

 


1.  배열을 함수에 전달할 때의 특징

 

 

C++에서 배열을 함수에 전달하면, 다른 기본 자료형과는 달리 배열 전체가 복사되어 전달되지 않습니다.

int my_numbers[] = {1, 2, 3, 4, 5};
print_array(my_numbers);  // 배열의 첫 번째 요소의 주소가 전달됨

배열 이름은 배열의 시작 주소를 나타냅니다.

따라서 함수는 (현재로서는) 배열의 크기를 알 수 없습니다.

즉, 반복문으로 몇 번 순회해야 하는지도 모릅니다.

 

 


2. 배열과 함께 크기를 전달해야 하는 이유

 

함수에 배열을 전달할 때는 크기(size) 도 함께 전달해야 합니다.

 

배열의 요소들을 전부 출력하는 print_array 함수를 구현해보겠습니다. 

 

❌ 잘못된 예

void print_array(int numbers[]);  // 배열만 받고 크기 정보 없음

int main() {
    int my_numbers[] = {1, 2, 3, 4, 5};
    print_array(my_numbers);
}

 

함수 내부에서는 배열의 크기를 알 수 없으므로 문제가 됩니다.

 

✅ 올바른 예

void print_array(int numbers[], size_t size);

int main() {
    int my_numbers[] = {1, 2, 3, 4, 5};
    print_array(my_numbers, 5);
}

void print_array(int numbers[], size_t size){
    for (size_t i = 0; i < size; i++) {
        cout << numbers[i] << endl;
    }
}

 

배열의 크기를 함께 전달함으로써 

size_t
는 음수가 될 수 없는 정수형으로, 인덱스나 크기를 나타낼 때 자주 사용됩니다.

 

그렇다면, 배열의 크기를 명시적으로 기재하지 않고 함수 내에서 자체적으로 알아내는 방법은 없을까요? 🤔💭

 


3.  배열 크기 자동 계산법 (주의)

 

다음 코드는 배열의 크기를 자동으로 계산하는 대표적인 방법입니다:

int size = sizeof(arr) / sizeof(arr[0]);
⚠️ 하지만 이 방식은 함수 내부에서는 동작하지 않습니다.

배열이 함수로 전달되면 단순히 포인터로 인식되기 때문에,  sizeof(arr) 는 전체 배열 크기를 알 수 없습니다.
다시 정리하자면, 인자로 전달받은 배열은 함수 내에서 그 크기를 알 수 없습니다.

 

배열을 함수에 전달할 때 알아둘 점이 더 있습니다.

 


4. 함수 내에서 배열을 변경하는 법

 

배열은 주소만 전달되므로, 함수 내부에서 배열의 내용을 직접 변경할 수 있습니다.

마치 Pass by reference처럼 동작합니다.

 

💡 예시

void zero_array(int numbers[], size_t size) {
    for (size_t i = 0; i < size; i++) {
        numbers[i] = 0;
    }
}

이 함수는 전달된 배열의 모든 값을 0으로 바꿉니다.

 

int main() {
    int my_numbers[] = {1, 2, 3, 4, 5};
    zero_array(my_numbers, 5);  // 원본 배열 값이 바뀜
}

 


5. 원본 배열의 변경을 막고 싶다면? const

 

배열을 읽기 전용으로 전달하고 싶다면 const 키워드를 사용하세요:

void print_array(const int numbers[], size_t size) {
    for (size_t i = 0; i < size; i++) {
        cout << numbers[i] << endl;
    }

    // numbers[i] = 0;  ← 컴파일 에러!
}

const가 붙으면, 배열의 값을 읽을 수만 있고 수정할 수 없습니다.

 

읽기 전용 배열 수정 시도 후 에러


 

요약

항목 설명
배열 전달 방식 배열의 주소가 전달됨 (복사가 아님)
크기 정보 함수에 명시적으로 크기를 함께 전달해야 함
값 수정 여부 배열은 기본적으로 함수 내부에서 수정 가능
수정 방지 방법 const 키워드 사용하여 읽기 전용으로 전달