Массивы позволяют обращаться с набором
логически связанных однотипных элементов как с единым целым. Если же требуется
хранить набор разнородных, но логически связанных данных, описывающих,
например, состояние некоторого объекта реального мира, используются структуры.
Синтаксис определения структуры имеет такой вид:
struct имя {список элементов}
[переменные];
Список элементов состоит из объявлений,
аналогичных объявлениям переменных. Объявления элементов оканчиваются точкой с
запятой. Вот пример структуры, предназначенной для хранения основных сведений о
человеке:
struct Person {
char lastName[32]; // Фамилия.
char firstName[32]; // Имя.
Sex sex; // Пол: перечислимый тип (male, female).
short age; // Возраст.
long phoneNum; // Телефон как длинное целое.
} aPerson; // Объявляет
переменную типа struct Person.
Переменная aPerson имеет свойства структуры Person.
Элементы структуры еще называются полями
структуры. Они могут иметь любой тип, кроме типа этой же структуры, но могут
быть указателями на него.
Если при определении имя структуры отсутствует, то обязательно должен быть
список переменных. Пример определения массива структур и указателя на
структуру:
struct {
char fio[30];
int date, code;
double salary; }stuff[100], *ps;
Если список переменных отсутствует,
описание структуры определяет новый тип, имя которого можно использовать в
дальнейшем наряду со стандартными типами, например:
struct Worker // определение
нового типа Worker
{ char fio[30];
int date, code;
double salary;
};
// определение массива типа Worker и указателя на тип Worker:
Worker stuff[100], *ps;
Определить новый тип структуры можно
иначе:
typedef struct
{ char fio[30];
int date, code;
double salary;
} Worker;
Имя Worker можно использовать в дальнейшем наряду со стандартными
типами.
Имя структуры можно использовать сразу
после его объявления (определение можно дать позднее) в тех случаях, когда
компилятору не требуется знать размер структуры, например:
struct List; // объявление
структуры List
struct Link //определение
структуры Link
{
List *p; // указатель на структуру List
Link *prev,
*succ; // указатели на структуру Link
}:
struct List { /* определение структуры List */};
Это позволяет создавать связные списки
структур.
Для инициализации структуры значения ее
элементов перечисляют в фигурных скобках в порядке их описания:
struct{
char fio[30];
int date, code;
double salary; }worker
= {"Страусенке", 31, 215, 3400.55};
При инициализации массивов структур
следует заключать в фигурные скобки каждый элемент массива (учитывая, что
многомерный массив – это массив
массивов):
struct complex
{
float real, im;
} compl [2][3] = {
{{1, 1}, {1, 1}, {1, 1}}
// строка 1. то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2, то есть массив compl[l]
};
Доступ к полям структурной переменной
выполняется с помощью операций выбора "." (точка) при обращении к
полю через имя переменной или ссылку и
"->" при обращении
через указатель, например:
Worker worker1, worker2,
stuff[100];
………..
worker1.fio
= "Страусенке";//доступ к полю fio через имя переменной
stuff[8].code
= 215; // доступ к полю code через имя переменной
Worker &stf=
stuff[50];
stf.date
= 31; // доступ к
полю date через ссылку
Worker *ps=&worker2;
ps->salary = 0.12;
// доступ к полю salary через указатель
Если элементом структуры является другая
структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a; double x:};
struct В (A a;
double x;} х[2];
х[0].а.а = 1;
х[1].х = 0.1;
Как видно из примера, поля разных
структур могут иметь одинаковые имена, поскольку у них разная область видимости.
Более того, можно объявлять в одной области видимости структуру и другой объект
(например, переменную или массив) с одинаковыми именами, если при определении
структурной переменной использовать слово struct, но лучше этого не делать – запутать компилятор труднее, чем себя.
|