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

Структуры

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Аннотация: Определение структурных переменных. Доступ к компонентам структуры. Поля битов в структурах. Объединения. Перечисления. Переменные структуры. Указатели структуры. Массив структур. Переименования типов.

Определение структурных переменных

Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется следующим описанием:

struct имя_структуры {
	Описание_элементов
};

Пример:

struct dinner {
	char *place;
	float cost;
	struct dinner *next;
};

Структурная переменная описывается с помощью переменной структурного типа.

Примеры:

struct dinner week_days [7];	/* массив структур */
struct dinner best_one;	/* одна структурная переменная */
struct dinner *p;	/* указатель на структурную переменную */

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

struct {
	список описаний
} имя;

В структуре должен быть указан хотя бы один компонент. Указатель типа структуры используется для определения структур. Определения структур имеют следующий вид:

тип-данных описатели;

где тип-данных указывает тип структуры для объектов, определяемых в описателях. В своей простейшей форме описатели представляют собой обычные имена переменных, массивов, указателей и функций. Например, с помощью определения

struct {
	double x,y;
} a,b,c[9];

переменные a и b определяются как структуры, каждая из которых состоит из двух компонентов - x и y. Переменная c определяется как массив из девяти таких структур.

Из определения

struct {
	int year;
	short int month, day;
} date1,date2;

следует, что каждая из двух переменных date1, date2 состоит из трех компонентов: year, month, day.

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

typedef struct {
	список описаний
} имя-типа-структуры;

Спецификатор typedef (определяет класс памяти) позволяет нам создать свое собственное имя типа. Это напоминает директиву #define, но со следующими тремя изменениями:

  1. В отличие от #define спецификатор typedef дает символические имена, но ограничивается только типами данных.
  2. Спецификатор typedef выполняется компилятором, а не препроцессором.
  3. В своих пределах спецификатор typedef более гибок, чем #define.

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

typedef struct {
	char name[30];
	int id;
	dept d;
	family f;
} employee;

где слова dept, family указывают типы, а именно типы структур, предварительно определенные пользователем. Тип структуры employee может быть использован для определения переменных. Например, определение

employee chairperson, president, e1, e2;

описывает переменные chairperson, president, e1, e2 как структуры типа employee.

Существует и другой способ ассоциирования имени с типом структуры. Этот способ основан на применении меток структуры. Метки структуры аналогичны меткам перечисляемого типа. Метка структуры описывается следующим образом:

struct метка{
	список описаний
}

где метка является идентификатором. В приведенном ниже примере слово student описывается как метка структуры:

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

Метки структуры используются для определения структур записью вида

struct метка список-идентификаторов;

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

struct node {
int data;
struct node *next;
};

метка структуры node действительно является рекурсивной, так как она используется в своем собственном описании, т.е. в описании указателя next. Из-за наличия знака * переменная next описана как указатель на объекты типа node. Структуры не могут быть прямо рекурсивными. Структура типа S не может содержать компонент, являющийся структурой типа S. Однако структура типа S может содержать компонент, указывающий на структуру типа S.

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Максим Сикстус
Максим Сикстус

При выполнении кода из Лекции 11, стр.2 получается результат:

x ravno 16.
x ravno 4.
x ravno 16.
x ravno 14.
x ravno 100.
x ravno 36.

Связано ли это с утверждением, что : "Единственным исключением при замене является макроопределение, находящееся внутри двойных кавычек"?

Андрей Белоусов
Андрей Белоусов

Я изучаю лекцию 5 и в ней есть выражения:

char *pc;

pc = (char*)0777;

Я так понял что, char *pc это ссылка на переменную pc,

0777 это тип int восьмиричный. А что делает выражение:

 pc = (char*)0777;

Станислав Мешавкин
Станислав Мешавкин
Россия, г. Заречный