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