Объявление параметра и * (массив)

Между формальными параметрами в определении функции, например:

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] является удобным способом указать просто, что указатель должен указывать на действительный объект.