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;
}