Операция индексирования E1[E2] определена так, что она идентична операции *(E1+E2). Следовательно, несмотря на асимметричность записи, индексирование - коммутативная операция. Учитывая правила преобразования, применяемые для оператора + и массивов (A6.6, A7.1, A7.7), можно сказать, что если E1 - массив, а E2 - целое, то E1[E2] обозначает E2-й элемент массива E1.
Так, x3d[i][j][k] означает то же самое, что и *(x3d[i][j]+k). Первое подвыражение, x3d[i][j], согласно A7.1, приводится к типу "указатель на массив целых"; по A7.7 сложение включает умножение на размер объекта типа int . Из этих же правил следует, что массивы запоминаются "построчно" (последние индексы меняются чаще) и что первая размерность в объявлении помогает определить количество памяти, занимаемой массивом, однако в вычислении адреса элемента массива участия не принимает.
А8.6.3. Объявители функций
В новом способе объявление функции T D, где D имеет вид
D1 ( список-типов-параметров )
и тип идентификатора объявления T D1 есть " модификатор-типа T", тип идентификатора в D есть " модификатор-типа функция с аргументами список-типов- параметров , возвращающая T". Параметры имеют следующий синтаксис:
список-типов-параметров :
список-параметров
список-параметров , ...
список-параметров :
объявление-параметра
список-параметров , объявление-параметра
объявление-параметра :
спецификаторы-объявления объявитель
спецификатор-объявления абстрактный-объявитель необ
При новом способе объявления функций список параметров специфицирует их типы, а если функция вообще не имеет параметров, на месте списка типов указывается одно слово - void . Если список типов параметров заканчивается многоточием ",...", то функция может иметь больше аргументов, чем число явно описанных параметров. (См. A7.3.2.)
Типы параметров, являющихся массивами и функциями, заменяются на указатели в соответствии с правилами преобразования параметров (A10.1). Единственный спецификатор класса памяти, который разрешается использовать в объявлении параметра, - это register , однако он игнорируется, если объявитель функции не является заголовком ее определения. Аналогично, если объявители в объявлениях параметров содержат идентификаторы, а объявитель функции не является заголовком определения функции, то эти идентификаторы тотчас же выводятся из текущей области видимости.
При старом способе объявление функции T D, где D имеет вид
D1 ( список-идентификаторов необ )
и тип идентификатора объявления T D1 есть " модификатор-типа Т", тип идентификатора в D есть " модификатор-типа функция от неспецифицированных аргументов, возвращающая Т". Параметры, если они есть, имеют следующий вид:
список-идентификаторов :
идентификатор
список-идентификаторов , идентификатор
При старом способе, если объявитель функции не используется в качестве заголовка определения функции (A10.1), список идентификаторов должен отсутствовать. Никакой информации о типах параметров в объявлениях не содержится.
Например, объявление
int f(), *fpi(), (*pfi)();
объявляет функцию f , возвращающую число типа int , функцию fpi , возвращающую указатель на число типа int , и указатель pfi на функцию, возвращающую число типа int . Ни для одной функции в объявлении не указаны типы параметров; все функции описаны старым способом.
Вот как выглядит объявление в новой записи:
int strcpy(char *dest, const char *source), rand(void);
Здесь strcpy - функция с двумя аргументами, возвращающая значение типа int ; первый аргумент - указатель на значение типа char , а второй - указатель на неизменяющееся значение типа char . Имена параметров играют роль хороших комментариев. Вторая функция, rand , аргументов не имеет и возвращает int .
Объявители функций с прототипами параметров - наиболее важное нововведение ANSI-стандарта. В сравнении со старым способом, принятым в первой редакции языка, они позволяют проверять и приводить к нужному типу аргументы во всех вызовах. Следует однако отметить, что их введение привнесло в язык некоторую сумятицу и необходимость согласования обеих форм. Чтобы обеспечить совместимость, потребовались некоторые "синтаксические уродства", а именно void , для явного указания на отсутствие параметров.
Читать дальше