Info

해당 글에서는 간단하게 배열을 reference로 보내는 문법에 대해서 알아보겠습니다.

배열 ‘arr’을 void func_ptr(int* arr, int size) 혹은 void func_arr(int arr[], int size)로 넘기게 된다면, 이는 포인터로 변환되어 전달되게 된다.

이를 참조로 넘기기 위해서는 다음과 같은 문법을 사용해야 한다.

void func_ref(int (&arr)[5])

이를 사용한 예제는 다음과 같다.

#include <iostream>
 
// 방법 1: 포인터로 받기 (가장 흔함)
void func_ptr(int* arr, int size) {
    std::cout << "1. func_ptr: sizeof(arr) = " << sizeof(arr) 
              << " (포인터의 크기)" << std::endl;
}
 
// 방법 2: 배열 문법으로 받기 (실제로는 포인터와 동일)
void func_arr(int arr[], int size) {
    std::cout << "2. func_arr: sizeof(arr) = " << sizeof(arr) 
              << " (이것도 포인터의 크기!)" << std::endl;
}
 
// 방법 3: 배열의 참조로 받기
// 이 함수는 크기가 정확히 5인 int 배열만 받을 수 있습니다.
void func_ref(int (&arr)[5]) {
    std::cout << "3. func_ref: sizeof(arr) = " << sizeof(arr) 
              << " (배열의 실제 크기!)" << std::endl;
}
 
int main() {
    int my_array[5] = {1, 2, 3, 4, 5};
    std::cout << "main: sizeof(my_array) = " << sizeof(my_array) << std::endl;
    std::cout << "---------------------------------" << std::endl;
 
    func_ptr(my_array, 5);
    func_arr(my_array, 5);
    func_ref(my_array);
}
 
------------------------------------------------------------------------------
 
main: sizeof(my_array) = 20
---------------------------------
1. func_ptr: sizeof(arr) = 8 (포인터의 크기)
2. func_arr: sizeof(arr) = 8 (이것도 포인터의 크기!)
3. func_ref: sizeof(arr) = 20 (배열의 실제 크기!)

활용

위와 같은 방식과 constexpr을 이용하면, 컴파일 타임에 손쉽게 배열의 크기를 가져올 수 있다.

template<typename T, std::size_t N>
constexpr std::size_t get_array_size(T (&)[N]) {
    return N;
}