{ 1, 3, 5 },
{ 2, 4, 6 },
{ 3, 5, 7 },
};
представляет собой инициализацию с полным набором фигурных скобок: 1, 3 и 5 инициализируют первую строку в массиве у[0], т. е. y[0][0], у[0][1] и y[0][2]. Аналогично инициализируются следующие две строки: y[1] и y[2]. Инициализаторов не хватило на весь массив, поэтому элементы строки y[3] будут нулевыми. В точности тот же результат был бы достигнут с помощью следующего объявления:
float у[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };
Инициализатор для
float у[4][3] = {
{ 1 }, { 2 }, { 3 }, { 4 }
};
инициализируется первый столбец матрицы
Наконец,
char msg[] = "Синтаксическая ошибка в строке %s\n";
представляет собой пример массива символов, элементы которого инициализируются с помощью строки; в его размере учитывается и завершающий NULL-символ.
A8.8. Имена типов
В ряде случаев возникает потребность в применении имени типа данных (например при явном приведении к типу, в указании типов параметров внутри объявлений функций, в аргументе оператора
(
Можно указать одно-единственное место в абстрактном объявителе, где мог бы оказаться идентификатор, если бы данная конструкция была полноценным объявителем. Именованный тип совпадает с типом этого "невидимого идентификатора". Например
intint *int *[3]int (*)[]int *int (*[])(void)
соответственно обозначают типы
А8.9. Объявление
Объявления, в которых спецификатор класса памяти есть
Объявление
typedef long Blockno, *Blockptr;
typedef struct { double r, theta; } Complex;
допустимы следующие объявления:
Blockno b;
extern Blockptr bp;
Complex z, *zp;
Объявление
extern Blockno;
не переобъявляет Blockno, а вот
extern int Blockno;
переобъявляет.
A8.10. Эквивалентность типов
Два списка спецификаторов типа эквивалентны, если они содержат одинаковый набор спецификаторов типа с учетом синонимичности названий (например,