Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры прога 2.docx
Скачиваний:
1
Добавлен:
18.09.2019
Размер:
83.31 Кб
Скачать

37,2,Структуры. Операции над структурами

Структуры нельзя сравнивать. Если объявлены две структ перем с одним шаблоном, то можно написать stud1=stud2; если они имеют один тип. Нельзя использовать операцию присваивания для структур, шаблоны которых под разным, хотя и идентичными, именами.

ПР: main()

{struct first{int a;

char b;};

struct second{int a;

char b;};

struct first a;

struct second b;

a.a=1,a.b=’f’;

b.a = a.a;

b.b = a.b

}

Шаблон имеет область видимости. Если шаблон объявлен внутри блока – локальный шаблон. Если шаблон объявлен вне блока, то он видим во всех ф-циях от точки объявления до конца файла. Нельзя описывать шаблон с реквизитом extern.

Переменная типа структуры также может быть локальной, глобальной и формальным параметром ф-ции.

При использовании структурных переменных в качестве параметров ф-ций используют 3 подхода:

1.Передавать элементы структурных переменных по отдельности

2.Передавать структуру целиком

3.Передавать указатель на структуру

Если передаётся структура по значению, то все элементы структуры заносятся в стек. Если структура большая, то стек может переполниться. При передаче по ссылке вся структура не копируется, а в стек заносится только адрес структуры. Можно объявить указатель на структуру: struct student *p;

Поскольку указатель на структуру используется часто то для доступа к её элементам существует ещё один способ – операция стрелка “->”.Операция ‘->’ и ‘.’ имеют одинаковый приоретет и вместе с операциями () и [] имеют наивысший приоритет.

Для доступа к структурам, размещенных динамич образом, для передачи в функции используют указатели.

38.Массив структур. Правило выравнивания структурных переменных в памяти

Если задан шаблон структуры:

struct student {char name[30];int kurs; char group[8];int stip;};

То можно записать массив:

struct student stud1kur[200];

Доступ к полю kur i-го элемента массива можно осуществить следующим способом:

1.stud1kur[i].kurs=2

2. (*(stud1kur+i)).kurs=2

3.(stud1kur+i)->kurs=2

Выравнивание задаётся опцией среды: Options-Code Generation-Alignment

1.Byte Alignment – выравнивание на границе байта

2.Word Alignment - выравнивание на границе слова

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

Правила выравнивания структурных переменных в памяти :

1) отдельная структурная переменная (элемент массива структур) начинается с четного адреса

2) любое поле ,тип которого не совпадает с типом char, будет начинатся с чётного адреса

3) при необходимости в конце структурной переменной добавляется ещё один байт так, чтобы число байт структурной переменной было чётным.

39.1,Переименование типов. Средство typedef.

Средства typedef позволяют давать новые имена или псевдонимы уже существующимии типами.Формат записи :

typedef имя_типа новое_имя_типа;

typedef int Lenght;

Lenght len, maxlen;

typedef char* String;

String p;

int strcmp(String,String);

Обычно средства typedef используют при создании сложных деклараций с использыванием структур.

typedef struct st1{char name[30];

Int kurs;

Char group[8];

Int stip; } STUDENT;

STUDENT stud1, stud2;

Декларация typedef не создает новый тип, она используется для того чтобы дать более короткие и понятные имена уже существующим типам.

Преимущества: