Объявление и инициализация структур

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. Объявление и инициализация структур - student2.ru

77. С целью принудительного расположения битовых полей в таких структурах допускается вставка безымянных полей:

78. struct { int a:10;

79. int :6;

80. int b:14; } yy;

Наши рекомендации