Предоставьте прототип для функции, чтобы компилятор знал, что происходит, когда выполняется вызов:
void foo(int (*arr)[3]);
int main ()
{
int arr[2][3];
foo (arr);
return 0;
}
void foo(int (*arr)[3])
{
**arr = 0;
}
Без прототипа компилятор должен делать предположения о переданных параметрах и о том, что возвращает функция. Компилятор может выдавать или не выдавать предупреждения об этом в зависимости от версии компилятора и настроек компилятора.