Структуры
Структура – это совокупность переменных, объединённых одним именем, предоставляющая общепринятый способ совместного хранения информации. Объявление структуры приводит к образованию шаблона, используемого для создания объектов структуры. Переменные, образующие структуру, называются членами структуры. (Члены структуры также часто называются элементами или полями.)
Фрагмент кода объявляет структуру, определяющую имя и адрес. Ключевое слово struct сообщает компилятору об объявлении структуры.
struct addr {
char name[30];
char street[40];
char city[20];
char region[3];
unsigned long int zip;
};
Объявление завершается точкой с запятой, поскольку объявление структуры – это оператор. Имя структуры addr идентифицирует структуру данных и является спецификатором типа. Имя структуры часто используют как ярлык.
Пока не создано никакой переменной. Определена только форма данных. Для объявления переменной, соответствующей данной структуре, следует написать:
addr addr_info; //C++
struct addr addr_info; //C
Когда объявлена структурная переменная, компилятор автоматически выделяет необходимый участок памяти для размещения всех её членов.
При объявлении структуры можно одновременно объявить одну или несколько переменных. Например:
struct addr {
char name[30];
char street[40];
char city[20];
char region[3];
unsigned long int zip;
} addr_info, binfo, cinfo;
объявляет структуру addr и переменные addr_info, binfo, cinfo данного типа.
Если необходима только одна структурная переменная, то нет необходимости в ярлыке структуры. Это означает, что
struct {
char name[30];
char street[40];
char city[20];
char region[3];
unsigned long int zip;
} addr_info;
объявляет одну переменную addr_info с типом определённым предшествующей ей структурой.
Стандартный вид объявления структуры следующий:
struct ярлык{
тип имя_переменной;
тип имя_переменной;
тип имя_переменной;
…
} структурные переменные;
Доступ к членам структуры
Доступ к отдельным членам структуры осуществляется с помощью оператора . («точка»). Например, следующий фрагмент кода присваивает члену zip структурной переменной addr_info значение 12345:
addr_info.zip = 12345;
Ко всем членам структуры доступ осуществляется точно таким же способом. Стандартный вид доступа следующий:
имя_структуры.имя_члена
Таким образом, массив символов addr_info.name может использоваться в fgets():
fgets(addr_info.name,30,stdin);
Для доступа к отдельным элементам addr_info.name можно использовать индекс. Например:
register int t;
for(t=0; addr_info.name[t]; ++t) putchar(addr_info.name[t]);
Присваивание структур
Информация, содержащаяся в одной структуре, может быть присвоена другой структуре того же типа с помощью одиночного оператора присваивания, то есть не нужно присваивать значение каждого члена по отдельности. Следующая программа демонстрирует присваивание структур:
#include <stdio.h>
int main()
{
struct ab{
int a;
int b;
} x, y;
x.a = 10;
x.b = 20;
y = x;
printf(“Contents of y: %d %d.”, y.a, y.b);
return 0;
}
После присваивания y.a и y.b будут содержать значения 10 и 20 соответственно.
Массивы структур
Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Например, для объявления 100-элементного массива структур типа addr, которая была ранее определена в данной лекции, следует написать:
struct addr addr_info[100];
Для доступа к отдельным структурам массива addr_info следует проиндексировать имя массива. Например, для вывода содержимого поля zip третьей структуры, следует написать:
printf(“%ld”, addr_info[2].zip);
Как и массивы переменных, массивы структур индексируются с 0.