Перша декларація повідомляє компілятору, що 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 має альтернативний нестандартний синтаксис для позначення таких функцій, щоб компілятор міг подавати попередження.)