Во-первых, параметр int key
не имеет ничего общего с struct key
в объявлении. Это просто неудачное именование.
Структуры находятся в другом пространстве имен, поэтому он работает.
Линия
struct key *p, **q;
Объявляет две переменные.
Первый называется p
и имеет тип struct key *
.
Второй называется q
и имеет тип struct key **
.
Звездочка, обозначающая тип указателя, привязывается к имени переменной , а не к общему типу в объявлении.
Кроме того, как я прокомментировал в ответе Мипади , у меня был профессор, который предположительно спросил Кернигана (или, может быть, это был Ричи), почему в выражениях C их декларации отражались в синтаксисе. Он сказал, что это будет возможность повторно использовать тот же код синтаксического анализа. По-видимому, компилятор C был довольно близок к тому, чтобы быть слишком большим для того, чтобы соответствовать системе, для которой он был написан.
Иногда это приятно, так как вы можете быть уверены, что если у вас есть объявление
int **foo[];
Тогда выражение
**foo[3]
будет иметь тип int
, без особого обдумывания.