Объявление и инициализация структур
6. То, что принято называть "шапкой" таблицы в языках программирования носит название шаблона структуры. Например, шаблон структуры, описывающей данные о книге, может быть устроен следующим образом:
7. struct book {
8. char title[40]; //наименование
9. char authors[30]; //авторы
10. char publishing_house[15]; //издательство
11. int year; //год издания
12. int pages; //количество страниц
13. float price; //цена
14. }
15. Идентификатор book выполняет функцию имени шаблона или типа структуры. В дальнейшем им можно пользоваться для объявления конкретных переменных – структур типа book:
16. struct book b1,b2,b3; //три переменных типа book
17. В языке C++ служебное слово struct можно опускать:
18. book b1,b2,b3;
19. Обратите внимание на то, что строковые поля в структурах имеют фиксированные размеры. Это существенно упрощает обработку данных, т.к. работа с полями переменной длины могла бы привести к очень медленно работающим программам.
20. Вообще говоря, объявление шаблона структуры и переменных, связанных с этой структурой, можно совместить:
21. struct book {
22. char title[40];
23. char authors[30];
24. char publishing_house[15];
25. int year;
26. int pages;
27. float price;
28. } b1,b2,b3;
29. Более того, в объявлении шаблона структуры можно опустить имя шаблона:
30. struct {
31. char title[40];
32. char authors[30];
33. char publishing_house[15];
34. int year;
35. int pages;
36. float price;
37. } b1,b2,b3;
38. Однако если данная структура должна выступить в качестве параметра какой-либо функции, то и в заголовке этой функции и в ее прототипе без имени шаблона не обойтись.
39. Для доступа к соответствующим полям структур используются составные имена, образованные из имени структуры и имени поля:
40. strcpy(b1.title,"C++:Экспресс курс"
41. strcpy(b1.authors,"В.Лаптев");
42. cout << b1.title;
43. b1.year=2004;
44. Если мы имеем дело с указателем, который настроен на адрес структуры, то составные имена записываются с использованием двух символов "->":
45. struct book *p=&b1; //указатель на структуру
46. strcpy(p->title,"C++:Экспресс курс"
47. strcpy(p->authors,"В.Лаптев");
48. cout << p->title;
49. p->year=2004;
50. Структуры могут объединяться в массивы:
51. struct book c[20]; //массив структур
52. И тогда для доступа к полям соответствующего элемента используются индексированные составные имена:
53. strcpy(с[2].title,"Язык C++ "
54. strcpy(c[2].authors,"В.В.Подбельский");
55. cout << c[2].title;
56. c[2].year=1996;
57. struct book *pс=с;
58. strcpy(pс[2]->title,"C++:Экспресс курс"
59. strcpy(pс[2]->authors,"В.Лаптев");
60. cout << pс[2]->title;
61. pс[2]->year=2004;
62. При объявлении переменных типа структура их поля могут быть проинициализированы довольно естественным способом:
63. struct book a={"Programming Languages", "Jean E.Sammet",
64. "Prentice-Hall", 1969,785,49.99};
65. Для структур, объявленных с использованием одного и того же шаблона, допустима операция присваивания:
66. b1=a; //все поля структуры a копируются в структуру b1
67. К сожалению, одноименные поля строкового типа у структур так копировать нельзя – необходимо прибегать к услугам функций типа strcpy:
68. strcpy(b1.authors,a.authors); //копируем поле "авторы"
69. Над содержимым числовых полей структур можно выполнять все операции, доступные для соответствующего типа данных.
70. Некоторые числовые поля структур могут быть объявлены как битовые шкалы с указанным количеством двоичных разрядов. С одной стороны, это предоставляет возможность компоновать в рамках машинных слов некоторые группы данных и располагать их более компактно в оперативной памяти. С другой стороны, такая возможность избавляет программиста от забот по выделению и вклеиванию соответствующих групп двоичных разрядов. Однако на расположение битовых полей в структурах оказывает дополнительное влияние установка компилятора – признак выравнивания данных на границу байта, слова, двойного слова. Длины битовых шкал при объявлении структур задаются следующим образом:
71. struct qq{ int a:10; int b:14; } xx, *px;
72. xx.a=127;
73. px=&xx;
74. px->b=9;
75. В зависимости от признака выравнивания границ данных эти значения могут быть расположены в оперативной памяти по-разному:
76.
77. С целью принудительного расположения битовых полей в таких структурах допускается вставка безымянных полей:
78. struct { int a:10;
79. int :6;
80. int b:14; } yy;