Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17195 / 2756 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 14:

Структуры

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

Переменные структуры

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

struct {
	общие компоненты;
	метка активного компонента;
	union {
		описание компонента 1
		описание компонента 2
		...
		описание компонента n
	}	идентификатор;
}

Ниже приведен пример определения переменной структуры health_record:

struct {
/* общая информация */
	char name[25];
	int age;
	char sex;
	/* метка активного компонента */
	marital_status ms;
	/* переменная часть */
	union {
		/* холост */
		/* нет компонентов */
		/* женат */
		struct {
			char marriage_date[8];
			char spouse_name[25];
			int no_children;
		}
	/* разведен */
	char date_divorced[8];
	} marital_info;
} health_record;

где тип marital_status, т.е. тип метки активного компонента ms, описан как

typedef enum {SINGLE, MARRIED, DIVORCED} 
	marital_status;

Ниже приведены несколько примеров ссылки на компоненты переменной структуры:

health_record.name
health_record.ms
health_record.marital_info.marriage_date

Указатели и структуры

Рассмотрим метку структуры student, описание которой было дано выше как

struct student {
	char name[25]; 
	int id, age;
	char sex;
}

Указатель new_student определен как

struct student *new_student;

Предположим, что память выделена таким образом, чтобы new_student указывал на объект student. Тогда на компоненты этого объекта можно ссылаться следующим образом:

(*new_student).name
(*new_student).id
(*new_student).age
(*new_student).sex

Поскольку указатели часто используются для указания на структуры, в языке Си специально для ссылок на компоненты таких структур введен оператор выбора стрелка вправо ->. Например, ссылки на вышеприведенные компоненты структуры можно записать с использованием оператора стрелки вправо -> как:

new_student->name
new_student->id
new_student->age
new_student->sex

Массив структур

Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:

struct book libry[MAXBKS];

Этот оператор объявляет libry массивом, состоящим из MAXBKS -элементов. Каждый элемент массива представляет собой структуру типа book. Таким образом, libry[0] является book -структурой, libry[1] - второй book -структурой и т.д.

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

libry[0].value value - первый элемент массива
libry[4].title title - пятый элемент массива
< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Вадим Дзюбенко
Вадим Дзюбенко
Украина, Винница, втл, 2017
Андрей Шулин
Андрей Шулин
Россия, Усть-илимск