@Bo Persson правильно заявляет в своем замечательном ответе здесь :
====================== ====================================
При передаче массива в качестве параметра этот
void arraytest(int a[])
означает то же, что и
void arraytest(int *a)
================================ ==========================
Однако позвольте мне также добавить, что это:
означает то же самое, f3]
, что означает точно такое же, как
void arraytest(int a[1])
, что означает точно такое же, как
void arraytest(int a[2])
, что означает точно такое же, как
void arraytest(int a[1000])
и т. д.
На самом деле значение «размер» внутри параметра массива здесь, по-видимому, предназначено только для эстетической / самостоятельной документации и может быть любым целым положительным (size_t
типом Я думаю) вы хотите!
На практике, однако, вы должны использовать его для указания минимального размера массива, который вы ожидаете от функции, чтобы при написании кода вам легко отслеживать и проверять. Стандарт MISRA-C-2012 ( купит / загрузит 236-страничный PDF-версия стандарта для £ 15,00 здесь ) до тех пор, пока не будет указано:
Правило 17.5. Аргумент функции, соответствующий параметру, объявленному для типа массива, должен иметь соответствующее количество элементов.
blockquote>...
Если параметр объявлен как массив с указанным размером, соответствующий аргумент в каждом вызове функции должен указывать на объект, у которого есть как минимум столько же элементов, сколько массив.
blockquote>...
Использование декларатора массива для параметра функции более четко определяет интерфейс функции, чем использование указателя. Минимальное количество элементов, ожидаемых функцией, явно указано, тогда как это невозможно с указателем. [emphasis added]
blockquote>Другими словами, они рекомендуют использовать формат явного размера, даже если стандарт C его технически не применяет - он по крайней мере помогает вам разъяснить как разработчик, так и другим, используя код, какой размер массива ожидает функция.