Перша декларація повідомляє компілятору, що 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):
Декларація параметра як "" масив типу "" має бути скоригована на "кваліфікований покажчик на тип", де класифікаторами типу (якщо такі є) є ті, які вказані в [і ]виведення типу масиву. Якщо статичне ключове слово також з’являється в межах [і ]виведення типу масиву, то для кожного виклику функції значення відповідного фактичного аргументу має забезпечити доступ до першого елемента масиву, що має принаймні стільки елементів, як зазначено в вираз розміру
int foo(struct bar [static 1]);замістьint foo(struct bar *);цього підпис для функцій, які не приймають покажчики NULL. (Я знаю, що gcc має альтернативний нестандартний синтаксис для позначення таких функцій, щоб компілятор міг подавати попередження.)