- •1. Понятие структур.
- •2. Определение структур.
- •4. Примеры структур
- •6. Задание структуры с помощью оператора typedef.
- •7. Обращение к полям структуры.
- •9. Вложение структур в структуры.
- •10. Присваивание структур
- •11. Массивы в структурах.
- •12. Структуры и функции.
- •13. Указатели и ссылки в структурах.
- •14. Массивы структур.
- •15. Указатели на структуры.
4. Примеры структур
Структура в си, содержащая информацию о точке в двумерном пространстве (координаты):
struct Point{
double x, y;
};
Структура в си, содержащая информацию об окружности (координаты центра и радиус):
struct Circle{
double x, y, radius;
};
Структура в си, содержащая информацию о студенте (фамилия, имя, отчество, номер зачетной книжки, средний балл):
struct Student{
char surname[15], name[15], patronymic[15];
unsigned number;
double rate;
};
Объявление переменной определенной структуры осуществляется после описания данной структуры в следующем виде:
struct тип имя №1[= значение №1][,...];
struct Point pnt[3] = {{0,0},{1,0},{0,1}};
struct Circle c1 = {10.0,10.0,5.0},
c2 = {0.0,0.0,25.0};
struct Student st
= {"Иванов”,”Иван”,”Иванович”,959623,7.5};
struct Group gr ={
"97-BC”, 3, {
{"Иванов”, ”Иван”, ”Иванович”, 979601,8.0},
{"Петров”, ”Петр”, ”Петрович”, 979602,6.5},
{"Сидоров”,”Сидор”,”Сидорович”,979603,9.0}
}
};
Как правило, члены структуры связаны друг с другом по смыслу. Например, элемент списка рассылки, состоящий из имени и адреса логично представить в виде структуры. В следующем фрагменте кода показано, как объявить структуру, в которой определены поля имени и адреса. Ключевое слово struct сообщает компилятору, что объявляется (еще говорят, "декларируется") структура.
struct addr
{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
};
Обратите внимание, что объявление завершается точкой с запятой, потому что объявление структуры является оператором. Кроме того, тег структуры addr идентифицирует эту конкретную структуру данных и является спецификатором ее типа.
В данном случае на самом деле никакая переменная не создается. Всего лишь определяется вид данных. Когда вы объявляете структуру, то определяете агрегатный тип, а не переменную. И пока вы не объявите переменную этого типа, то существовать она не будет. Чтобы объявить переменную (то есть физический объект) типа addr, напишите следующее:
struct addr addr_info;
В этом операторе объявлена переменная типа addr, которая называется addr_info. Таким образом, addr описывает вид структуры (ее тип), a addr_info является экземпляром (объектом) этой структуры.
Когда объявляется переменная-структура, компилятор автоматически выделяет количество памяти, достаточное, чтобы разместить все ее члены. На рис. 7.1 показано, как addr_info размещена в памяти; в данном случае предполагается, что целые переменные типа long занимают по 4 байта.+------------------------------------------+
|Name (имя) 30 байт |
+------------------------------------------+
+-------------------------------------------------+
|Street (улица) 40 байт |
+-------------------------------------------------+
+-----------------------------------+
|City (город) 20 байт |
+-----------------------------------+
+---------------------+
|State (штат) 3 байта |
+---------------------+
+----------------------------+
|Zip (код) 4 байта |
+----------------------------+
Рис. 7.1. Расположение в памяти структуры addr_info
Одновременно с объявлением структуры можно объявить одну или несколько переменных. Например,
struct addr {
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
} addr_info, binfo, cinfo;
определяет тип структуры, называемый addr, и объявляет переменные этого типа addr_info, binfo и cinfo. Важно понимать, что каждая переменная-структура содержит собственные копии членов структуры. Например, поле zip в binfo отличается от поля zip в cinfo. Изменения в zip из binfo не повлияют на содержимое поля zip, находящегося в cinfo.
Если нужна только одна переменная-структура, то тег структуры является лишним. В этом случае наш пример объявления можно переписать следующим образом:
struct {
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
} addr_info;
В этом случае объявляется одна переменная с именем addr_info, причем ее поля указаны в структуре, которая предшествует этому имени.
Общий вид объявления структуры такой:
struct тег {
тип имя-члена;
тип имя-члена;
тип имя-члена;
.
.
.
} переменные-структуры;
причем тег или переменные-структуры могут быть пропущены, но только не оба одновременно.
5. Оператор typedef.
В язык Си введено специальное средство, позволяющее назначать имена типам данных (переименовывать). Таким средством является оператор typedef. Он записывается в следующем виде:
typedef тип имя;
Здесь "тип" - любой разрешенный тип данных и "имя" - любой разрешенный идентификатор.
Рассмотрим пример:
typedef int INTEGER;
После этого можно сделать объявление:
INTEGER а, b;
Оно будет выполнять то же самое, что и привычное объявление int a,b;. Дру-гимисловами, INTEGER можно использовать как синоним ключевого слова int.