При работе с массивами и указателями на 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" (это была просто опечатка).