Работа со структурами
Под структурой понимают совокупность данных разного типа, лежащих в непрерывной области памяти и объединенных общим именем.
Отличие от массивов - элементы структуры разного типа.
Необходимость: часто реальный объект характеризуется величинами разного типа.
Пример: товар на складе
название char name[21];
цена float price;
количество int number;
Все три переменных неразрывно связаны с каким-то товаром.
Описание структуры
1 Способ.
struct {
char name[21];
float price;
int number;
} goods;
Выделяется 27 байт для переменной goods;
2 Способ.
struct _GOODS {
char name[21];
float price;
int number;
};
Оператор не выделяет память, а устанавливает тип структуры. Для выделения памяти надо выдать оператор:
struct _GOODS goods1, goods2;
Выделяет память для goods1 и goods2, каждой по 27 байт.
Можно смешать два способа:
struct _GOODS { char name[21];
float price;
int number;
} goods;
Устанавливает тип структуры и выделяет память для goods.
3 способ. Используется оператор описания типа typedef:
typedef double real;
Если при описании имени стоит слово typedef, то описание не выделяет память, а создает новый тип данных (в данном случае – real), который можно применять также как и любое другое описание типа:
real a, b;
В случае структуры имеем:
typedef struct { char name[21];
float price;
int number;
} GOODS;
GOODS goods1, goods2; - выделение памяти для переменных goods1 и goods2.
Трактовка имени структуры.
Имя структуры обозначает значение всей области памяти, которую она занимает. Поэтому для структур одного и того же типа допускается операция присваивания:
goods2 = goods1;
При этом вся область памяти goods1 копируется в область памяти goods2.
Доступ к элементу структуры.
Для этого используется операция "." (точка).
goods1.name - образовалось составное имя.
Тип составного имени такой же как тип соответствующего элемента структуры.
С составным именем можно выполнять любые действия, разрешенные для типа элемента.
goods2.price = 20*goods1.price;
scanf("%s", goods1.name);
Из структур можно составить массив:
GOODS ab[50];
Тогда ab - адрес массива;
ab[2] - значение структуры;
ab[2].price - значение элемента структуры.
Структура может входить в другую структуру:
typedef struct {
GOODS goods;
int fl;
} GF;
GF a; - описание
a.good.name – доступ к члену name вложенной структуры.
Никаких ограничений на уровень вложенности структур нет.