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