Хотелось бы понять логику синтаксиса C++.
Объявление переменной:
Имя_типа Имя_переменной;
Здесь все понятно.
Далее объявление указателя на переменную:
Имя_Типа * Имя_Переменной;
Должно же быть какое-то согласование с предыдущим правилом. Что здесь считать типом, а что именем переменой? Можно считать, что Имя_типа* есть новый производный тип, тогда все согласуется.
Массив определяется так:
Имя_Типа Имя_Переменной [Размер];
Массив на указатели определяется так:
Имя_Типа * Имя_Переменной [Размер];
Здесь также можно считать, что Имя_типа* есть новый производный тип указателя на тип Имя_типа, тогда все согласуется.
Указатель на массив определяется так:
Имя_Типа (*Имя_Переменной) [Размер];
Здесь я не вижу логики. Аналогично с ссылками на функции. Конечно, эти правила можно зазубрить, но отсутствие логики меня очень расстраивает
По-моему, так было бы логичнее:
(Имя_Типа [Размер])* Имя_Переменной;
Так выражение согласуется с правилом объявления переменной: Имя_типа Имя_переменной;
Есть мнение, что определение сущности имеет иметь тот же синтаксис, что и её использование.
Согласно этой идее, нужно представить, что *Имя_Переменной - это как бы прототип операции разыменования и переменная после разыменования имеет тип Имя_Типа. Появляется какая-то логика.
Но операция явного приведения типов все портит:
Имя_Переменной1 = (Имя_Типа)Имя_Переменной2;
Имя_Типа *Имя_Переменной;
Имя_Переменной = (Имя_Типа *) 0хB8000000;
В последнем выражении Имя_Типа* уже рассматривается как новый тип, к которому приводим. Это как-то не очень согласуется с этим интуитивным предполагаемым правилом.
Может все-таки кто-то может объяснить?