배열 형식 인수는, 첫번째 요소의 포인터로 전달(축소)한다.

함수에서도 마찬가지로, 함수 인수는 함수로의 포인터로 축소된다.

하지만 함수 포인터는 배열과는 다르게 연결이 끊기고 인수와 반환 형식을 담는데 유용하다.

 

배열 형식 인수에서 배열의 바운드는 무시가 된다. 그래서 매개변수에서 생략되는 경우가 대부분이다.

보통은 배열의 크기를 명확하게 전달하는 것이 해결책이다.

void func(int arr[10]); // 10 은 무시된다
void func(int arr[]);   // 둘이 똑같이 포인터로 축소되어 넘어간다

void func(int arr[], int size); // 배열의 크기를 따로 넘겨주자!

 

만약 배열 바운드의 값이 중요할 경우에는, 아래와 같이 포인터가 아닌 레퍼런스로 넘겨주는 것이 좋다.

이 경우 템플릿을 사용하면 일반화 하기가 편하다.

하지만 레퍼런스를 사용하게 되면, 실제로 넘겨줄 인수 배열에 포인터가 사용되면 에러가 난다.

void func(int (&arr)[10]);  // 10개짜리 int 배열에 넘길 수 있다!

template<int n>
void func(int (&arr)[n]);   // 일반화

int* arrArg = new int[10];  // 에러
func(arrArg);               // int(&) 를 int* 로 초기화할 수 없다

 

따라서 다차원 배열의 경우는 아래와 같다.

void func(int (*arr)[20]); // 20개 int 배열들에 대한 포인터
void func(int arr[][20]);  // 실제 인수가 배열임을 더 명확하게 드러낸다

 

웬만해선 그냥 배열 대신 벡터, 문자열 대신 스트링을 사용하도록 하자. ㅋㅋ

'STUDY > C++' 카테고리의 다른 글

[C++] 레퍼런스 (L value - R value)  (0) 2020.07.11
[C++] 얼리 리턴?  (0) 2020.07.10
[C++] const 포인터와 const 로의 포인터?  (0) 2020.06.29
[C++] 키워드 static  (0) 2020.05.26
[C++] list 를 쓸까?  (0) 2020.05.22

+ Recent posts