Чтобы ответить на ваш вопрос:
когда пишешь:
p = a[0];
a[0]
(теперь 0-й элемент в массив 1D) на самом деле распадается на указатель p
. Таким образом, оба не совсем одного типа, хотя они, кажется, есть. Когда вы пишете:
fun(a[0]);
Вы фактически передаете 0
элемент массива, который теперь является одномерным массивом. Таким образом, вы можете получить одним из следующих способов:
fun(int *p); // decay to pointer to 1D array
fun(int (&a)[2]); // receive array by reference
В обоих случаях fun()
теперь имеет одномерный массив.
Чтобы упростить задачу, передайте ссылку на массив:
void fun(int (&p)[2][2])
{
cout<<p[1][1]; // ok !
}
Использование:
fun(a); // not a[0]