Пример 3.
union {
char m[2][3];
int i, j, k;
} y = {
{'1'},
{'4'}
};
В третьем примере инициализируется переменная у типа объединение. Первым элементом объединения является массив; он и будет инициализироваться. Список инициализаторов {'1'} задает значения для первой строки массива (m[0]). Поскольку в списке всего одно значение, то только первый элемент строки массива — m[0][0] —инициализируется символом '1', а оставшиеся два элемента в строке инициализируются по умолчанию нулевыми значениями (символом '\0'). Аналогично, первый элемент второй строки массива m инициализируется значением '4', а остальные элементы инициализируются по умолчанию нулевыми значениями.
Существует специальная форма инициализации массива типа char— с помощью символьной строки. Например, объявление
char code[] = "abc";
инициализирует массив code четырьмя символами—'a', 'b', 'c' и символом '\0', который завершает символьную строку.
Если в объявлении размер массива указан, а длина инициализирующей строки превышает указанный размер, то лишние символы отбрасываются. Следующее объявление инициализирует трехэлементный массив code типа char:
char code[3] = "abcd";
В примере только три первые символа инициализатора заносятся в массив code. Символ d и символ '\0' отбрасываются.
Если инициализирующая строка короче, чем специфицированный размер массива, то оставшиеся элементы массива инициализируются нулевым значением (символом '\0').
Символьной строкой можно инициализировать не только массив типа char, но и указатель на тип char. Например, в объявлении
char *ptr = "abcd";
указатель ptr будет инициализирован адресом массива типа char, содержащего символы 'а', 'b', 'с', 'd', '\0'.
Существует два особых вида объявления, в которых объявляется не переменная или функция, а тип данных. Первый вид позволяет определить тег и элементы структуры, объединения или перечислимого типа. После такого объявления имя типа (тег) может быть использовано в объявлениях переменных и функций для ссылки на этот тип.
Второй вид объявления типа использует ключевое слово typedef. Это объявление позволяет присвоить осмысленные имена типам, уже существующим в языке или создаваемым пользователем.
Объявление типа имеет такую же блочную область действия, как и объявление переменной. Локальное переобъявление имени типа также возможно. Однако теги занимают отдельное пространство имен, а идентификаторы, объявленные посредством typedef, разделяют пространство имен с переменными и функциями.
Объявление типа структуры, объединения или перечислимого типа имеет такую же синтаксическую форму, как и объявление переменной этих типов, однако в объявлении типа идентификатор переменной (а в общем случае описатель) опущен. Именем типа структуры, объединения или перечислимого типа является тег, который в данном случае обязателен.
Примеры.
/* пример 1 */
enum status {
loss = -1,
bye,
tie = 0,
win
};
/* пример 2 */
struct student {
char name [20];
int id, class;
}
В первом примере объявляется перечислимый тип с именем status. Имя типа может быть использовано в объявлениях переменных этого перечислимого типа. Идентификатору lossявно присваивается значение -1. Идентификаторы byeи tieассоциируются со значением 0, a win- со значением 1.
Во втором примере объявляется структурный тип с именем student. Объявление типа studentпозволяет записывать впоследствии лаконичные объявления переменных этого типа, например объявление struct student employee, в котором объявляется структурная переменная employeeтипа student.
Синтаксис:
typedef < спецификация типа > < описатель >{, < описатель >…];
Объявление typedefсинтаксически аналогично объявлению переменной или функции, за исключением того, что вместо спецификации класса памяти записывается ключевое слово typedefи отсутствует инициализатор.
Объявление typedefинтерпретируется таким же образом, как объявление переменной или функции, однако идентификатор, входящий в состав описателя, специфицирует не переменную или функцию, а тип. Идентификатор становится синонимом для объявленного типа и может употребляться в последующих объявлениях. Другими словами, создаются не новые типы, а имена для специфицированных программистом типов. С помощью typedefможет быть объявлено имя для любого типа, как базового, так и составного — указателя, функции, массива.
Читать дальше