Вопрос: Тогда почему объявления указателей и массивов взаимозаменяемы в качестве формальных параметров?

Ответ:
Оператор sizeof сообщает размер указателя, который на самом деле
получает функция. (см. вопрос 2.4).

Так как массивы немедленно превращаются в указатели, массив на самом деле не передается в функцию. По общему правилу, любое похожее на массив объявление параметра
  f(char a[])

рассматривается компилятором как указатель, так что если был передан массив, функция получит:
  f(char *a)

Это превращение происходит только для формальных параметров функций, больше нигде.
Если это превращение раздражает Вас, избегайте его; многие пришли к выводу, что порождаемая этим путаница перевешивает небольшое преимущество от того, что объявления смотрятся как вызов функции и/или напоминают о том, как параметр будет использоваться внутри функции.

Смотри:
K&R I Разд.5.3 c. 95, Разд.A10.1 c. 205;
K&R II Разд.5.3 c. 100, Разд.A8.6.3 c. 218, Разд.A10.1 c.226;
H&S Разд.5.4.3 c. 96;
ANSI Разд.3.5.4.3, Разд.3.7.1,
CT&P Разд.3.3 c. 33-4.
Автор: Кодт    Оценить