При работе с массивами и указателями на C быстро обнаруживается, что они никоим образом не эквивалентны, хотя это может показаться на первый взгляд. Я знаю о различиях в L-значениях и значениях R. Тем не менее, в последнее время я попытался выяснить тип указателя, который я мог бы использовать в сочетании с двумерным массивом, т.е.
int foo[2][3];
int (*a)[3] = foo;
Однако я просто не могу понять, как компилятор "понимает" определение типа a, несмотря на правильные правила приоритета оператора для * и []. Если вместо этого я должен был использовать typedef, проблема станет значительно проще:
int foo[2][3];
typedef int my_t[3];
my_t *a = foo;
В нижней строке, может ли кто-нибудь ответить мне на вопросы о том, как компилятор читает термин int (*a)[3]? int a[3] прост, int *a[3] также прост. Но тогда почему это не int *(a[3])?
EDIT: Конечно, вместо "typecast" я имел в виду "typedef" (это была просто опечатка).