Первое объявление сообщает компилятору, что someArray
имеет длину как минимум 100 элементов. Это может быть использовано для оптимизации. Например, это также означает, что someArray
никогда не равно NULL.
Обратите внимание, что стандарт C не требует, чтобы компилятор диагностировал, когда вызов функции не удовлетворяет этим требованиям (т. Е. Это молчаливое неопределенное поведение).
Второе объявление просто объявляет someArray
(не someArray
's элементы!) Как const, то есть вы не можете написать someArray=someOtherArray
. Это так же, как если бы параметр был char * const someArray
.
Этот синтаксис может использоваться только внутри самого внутреннего []
объявления массива в списке параметров функции, он не будет иметь смысла в других контекстах.
Стандартный текст, который охватывает оба вышеупомянутых случая, находится в C11 6.7.6.3/7 (был 6.7.5.3/7 в C99):
Объявление параметра как «массива типа» должно быть скорректировано на «квалифицированный указатель на тип», где квалификаторы типа (если таковые имеются) - те, которые указаны в [
и ]
вывод типа массива. Если ключевое слово static также присутствует в пределах [
и ]
деривации типа массива, то для каждого вызова функции значение соответствующего фактического аргумента должно обеспечивать доступ к первому элементу массива, по крайней мере, как много
элементы, указанные в выражении размера.