Между формальными параметрами в определении функции, например:
void change (int *s) { s[0] = 42; }
И еще одно определение:
void change (int s[]) { s[0] = 42; }
Они такие же, как я предполагаю, поскольку *(a+0)
совпадает a[0]
.
Есть ли причина предпочитать одну над другой? Обратите внимание, что предпочтение относится к стилю кодирования.
Да, они точно такие же. Все параметры функций, объявленные как массивы, настраиваются на соответствующий тип указателя.
Лично я предпочитаю первое, что на самом деле делает его похожим на декларацию указателя, что и есть в обоих случаях.
Я предпочитаю второй, потому что тогда ясно, что вы собираетесь использовать s
как массив. (хотя это технический указатель)
Я думаю, что это просто еще одна субъективная вещь.
Существует один случай, когда они могут быть разными, на текущем языке C. C99 позволяет:
void change (int s[static 2]) { s[0] = 42; }
где [static 2]
накладывает ограничение на интерфейс функции, который переданный указатель должен быть таким, чтобы s[0]
и s[1]
имели доступ к действительным объектам типа int
. В частности, интерфейс не допускает указателей NULL
.
Обратите внимание, что [static 1]
является удобным способом указать просто, что указатель должен указывать на действительный объект.