Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по программированию и алгоритмизаци...doc
Скачиваний:
31
Добавлен:
05.09.2019
Размер:
2.24 Mб
Скачать

4.5.2. Структуры

Структурой называется совокупность логически связанных перемен­ных, возможно, различных типов, сгруппированных под одним именем.

Структура в языке С/С++ аналогична по смыслу записи в ТР. Вид ее описания:

struct <имя структуры>

{

тип <имя_поля1>; // Определение структуры

тип <имя_поля2>; // является оператором,

тип <имя_поляN>; // поэтому заканчивается

} ; // точкой с запятой.

Определение структуры является оператором, поэтому заканчивается точкой с запятой. Переменные, которые объединяются структурой, называются членами, элементами или полями структуры.

Пример определения структуры STUDENT (сведений о студенте)

struct STUDENT {

сhar Name[30];

char Groupe[5];

int Age;

};

Такая запись не задает никакой переменной и выделения памяти не про­из­во­дится. Под именем STUDENT задаетcя частный вид структуры или шаблон струк­туры, т.е. определен новый тип struсt STUDENT. Для объяв­ления конкретных переменных этого типа можно написать:

struct <имя структуры> <список переменных>;

Пр. struct STUDENT stud1, stud2;

Переменные также могут задаваться одновременно с шаблоном

struct STUDENT {

сhar Name[30];

char Groupe[5];

int Age;

} stud1, stud2;

Теперь объявлены две переменные и компилятор автоматически выделит под них память (под каждую переменную непрерывный участок).

Внешние статические структуры можно инициировать, помещая следом за определением список начальных значений элементов:

struct stud1="Графкин Е.","В-227",18;

Доступ к элементу поля осуществляется с помощью операции "точка" или "выделения элемента": <имя_переменной_стр>.<имя_поля>

Пример. strcpy(stud2.name, "Петров К.");

Для печати содержимого поля группы элемента структуры запись бу­дет иметь вид: printf(" %c", stud1.Grupe);

Для пятого элемента этого поля – printf("%c",stud1.Grupe[4]);

На практике структурные переменные объединяются в массивы струк­тур. Для объявления массива структур сначала задается шаблон структу­ры, далее объявляется массив:

struct stud1 sudents[40]; // в памяти создается 30 переменных [0..29].

Если объявлены две переменные типа структур с одним шаблоном, то их можно присваивать друг другу: stud2=stud1;

В этом случае происходит побитовое копирование каждого поля одной структурной переменной в соответствующее поле другой переменной. Переменные типа структуры, описанные под разными именами (даже идентичные) друг другу присваивать нельзя.

Пример: void main() struct St1 m,k;

{struct St1 {int a; struct St2 l;

char b; k . a=1;

}; k . b=’f’;

struct St2 {int a; m=k; // верно

char b; l=k; // неверно

}; l . a=k . a; l . b=k . b; // верно

Переменная типа структура может быть глобальной, локальной или формальным параметром. Любое поле структуры может быть пара­метром функции func1(int k.a); параметром может является и адрес поля func2(int &k.a).

Можно в качестве формального параметра передать по значению всю структуру, создать указатель на структуру и передать аргумент типа структуры по ссылке. Объявление указателя на структуру имеет вид:

struct <имя структуры> * <имя указателя>;

Например, struct St*uk; // uk – переменная типа указатель на структуру St.

Если передается структура по значению, то все ее элементы заносятся в стек. Если она содержит в качестве своего элемента массив, стек может переполниться. Поэтому рекомендуется использовать ссылки. При передаче по ссылке в стек заносится только адрес структуры, при этом копирование структуры не происходит, а так же появляется возможность менять содержимое элементов.

Указателю можно присвоить адрес переменной uk=&m.

Для получения значения поля а переменной m используется операция доступа к полю:

(*uk).a или uk->a;

Структура операции доступа к полю по указателю

переменная_указатель -> имя_поля; ( перем_указ -> элемент_структуры;)

Операция "стрелка" употребляется, когда необходимо использовать значение элемента структуры с применением переменной-указателя.

В качестве элементов структуры можно использовать массивы, другие структуры, и массивы структур. Например:

struct Adr сhar

{ city[30];

int ind;

char adres[40];

};

struct STUDadr сhar Name[30];

{ struct Adr addr;

char groupe[6]; } st1, st2;

Adr-шаблон структуры, определеный перед объявлением структуры STUDadr. Для присвоения значения элементу ind структуры STUDadr значения надо записать: st1.addr.ind=50.