Добавил:
Лабы/курсовые по программированию (С++/Verilog HDL), Теория и Практика Помехоустойчивого Кодирования Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1сем Дагаев / lectures_3.pdf
Скачиваний:
44
Добавлен:
09.03.2022
Размер:
769.01 Кб
Скачать

41. Структуры

Структура – это вторая разновидность агрегатных типов данных языка Си. Структура – совокупность величин, объединенных одним именем. Компоненты структуры называют:

элементами,

полями,

членами.

От уже рассмотренных выше массивов структура отличается в следующих отношениях:

отсутствует упорядоченность между компонентами,

в отличие от массивов компоненты структуры могут иметь разный тип.

другой способ обращения к компонентам; к компонентам

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

Обратим внимание на неоднозначность термина структура. В языке Си под этим термином наряду со структурой как типом данных понимают переменную, имеющую тип структуры.

41.1.Объявление структур

Общий формат, позволяющий наряду с типом объявлять и переменные, имеет следующий вид:

struct[<α>]

{

<β> }[γ];

119

Здесь:

struct – ключевое слово языка Си,

α - необязательный элемент, называемый тегом,

β

- список объявлений полей,

γ

- список переменных, имеющих тип объявляемой структуры.

Элементы объявления α и γ могут отсутствовать. Список γ подчиняется синтаксису обычных переменных. Переменные, включенные в этот список, могут использоваться только в составе структурной переменной. Определение такого формата выполняют две функции:

объявляют структуру как тип данных.

определяет переменные, имеющие этот тип. Рассмотрим ряд примеров.

Пример 1. Совместное определение типа и переменных

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

} employee, worker;

Тегом определяющей здесь структуры является здесь идентификатор person_salary. Структура имеет два поля. Первым полем является строка fio, предназначенная для хранения фамилии, имени и отчества. Второе поле имеет тип double и предназначено для хранения сведений о заработке. Здесь же определены две переменные, имеющие структурный тип:

employee (служащий),

worker (рабочий).

Здесь необходимо следует иметь в виду следующее. В программе, написанной на языке C++, тег является именем типа. В языке Си в качестве имени типа следует использовать конструкцию struct <α (тег)> .

Пример 2. Раздельное определение типа и переменных

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

//…

struct person_salary employee, worker;

Пример 3. Компонент тег можно опускать

#define MLEN 81 struct

{

char fio[MLEN]; double salary;

} employee, worker;

120

В этом примере определен так называемый анонимный тип. У этого типа нет тега. Поэтому на него нельзя ссылаться в другом программном коде. Польза от этого кода в определенных здесь двух переменных employee и worker.

Пример 4. Определение типа, переменной и указателя на структуру.

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

//…

struct person_salary employee; struct person_salary* p = &employee;

Здесь дополнительно объявлен и инициализирован указатель на структуру типа struct_salary.

41.2.Обращение к полям структуры

Для обращения к отдельным полям структуры в языке Си служат два оператора:

.

->

Оператор . используется в том случае, когда известна переменная, имеющая тип структуры. Оператор -> при работе со структурой через указатель. Оба оператора относится к категории бинарных операторов. Эти операторы имеют следующий формат:

<α1> . <β>.

<α2> -> <β>.

Здесь α1 – переменная, имеющая тип структуры, α2 – указатель, установленный на объект типа структуры, а β - поле структуры.

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

программный код.

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

//…

struct person_salary employee; struct person_salary* p = &employee;

Тогда можно написать следующий программный код, содержащий

обращения к полям объекта employee. strcpy(employee.fio, “Petrov Ivan Ivanovich”);

puts(p->fio); p->salary = 10000;

121

printf(“%10.3f\n”, employee.salary);

41.3.Инициализация структур

Структура может быть инициализирована во время своего определения.

Ограничимся примером.

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

int main(void)

{

struct person_salary new_person = {

“Ivanov I.I”, 25000

};

// …

}

41.4.Операции над структурами

Со структурой как со структурной переменной можно выполнять следующие операции:

присваивание,

передавать в функцию по значению,

передавать в функцию с использованием указателя,

∙ структуру можно использовать как значение, возвращаемое функцией.

Остальные операции со структурами выполняются по компонентно. Пример 1. Присваивание структур.

Постановка задачи. Имеются две структуры person1 и person2. Требуется скопировать поля структуры person1 в структуру person2.

Решение

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

int main(void)

{

struct person_salary person1 = {

“Ivanov I.I”, 25000

};

122

struct person_salary person2 = {

“Petrov P.P”, 17000

};

person2 = peson1; // …

}

После выполнения этого фрагмента программного кода все поля структуры person1 оказались скопированными в структуру person2.

Пример 2. Возврат функцией значения типа структуры.

Постановка задачи. Заданы значения полей. Требуется сформировать структуру (построить структурную переменную) структуру.

Решение

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

};

// Прототип функции, которая формирует структуру

struct person_salary form_struct(const char* fio, double salary);

int main(void)

{

struct person_salary = form_struct(“Petrov P.P.”, 20000); //…

}

struct person_salary form_struct(const char* fio, double salary)

{

struct person_salary temp; strcpy(temp.fio, fio); temp.salary = salary; return temp;

}

Пример 3. Использование указателей для передачи структур в качестве аргументов функций.

Постановка задачи. Выполнить обмен значений двух структур.

Решение

#define MLEN 81 struct person_salary

{

char fio[MLEN]; double salary;

123

Соседние файлы в папке 1сем Дагаев