#include <iostream>
using namespace std;

const int MAX = 10; // 컴파일 타임 상수여야만 하지요.

// void tyhan(int matrix[MAX][]){ 틀림!
void tyhan(int matrix[][MAX]){ // 첫째 []만 비울 수 있습니다. 그 뒤부터는 채워 줘야 함
	cout << "tyhan" << endl; // 고차원 배열의 구현원리를 알면 이해할 수 있죠.
	return;
}

void func1(int (&a)[MAX][MAX]){ // 좀더 C++답게 짤 수도 있어요.
	cout << "func1" << endl;  // 전달하고자 하는 타입의 참조자로 만드는 거죠.
	return;
}

void func2(const int (&b)[MAX][MAX]){ // 파라미터를 바꾸게 하고 싶지 않다면,
	cout << "func2" << endl; // const가 좋은 선택입니다.
	return;
}

typedef int array_2d_t[MAX][MAX]; // 누구나 복잡한 C++ 선언 문법을 100% 아는 건 아니죠.
void func3(array_2d_t &c){ // 초보자를 배려합시다. 이러면 읽기도 더 쉽고...
	cout << "func3" << endl;
	return;
}

typedef const int const_array_2d_t[MAX][MAX]; // 마찬가지.
void func4(const_array_2d_t &d){
	cout << "func4" << endl;
	return;
}

int main() {
	int arr[MAX][MAX];
	tyhan(arr);
	func1(arr);
	func2(arr);
	func3(arr);
	func4(arr);
	return 0;
}