Согласно этому источнику http://unixwiz.net/techtips/reading-cdecl.html,, используя правило "идите направо, когда можете, идите налево, когда вы должны", мы получаем следующие 2 значения объявлений, приведенных в предыдущих ответах -
int **val ==> val is a pointer to pointer to int
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int.
Я надеюсь, что приведенные выше значения имеют смысл, и если они этого не делают, вероятно, было бы неплохо изучить вышеупомянутый источник.
Теперь должно быть ясно, что второе объявление являетсятот, который ищет moteutsch, так как объявляет указатель на массив указателей.
Так почему же работает и первый?Помните, что
int* arr[MAX]
- это массив целых указателей .Итак, val - это указатель на первый указатель на int, объявленный внутри массива указателей на int.