
- •Определение структуры включает
- •2 Этапа:
- •Оператор typedef
- •Определение структуры безымянного типа
- •Оператор sizeof
- •Доступ к элементам структуры.
- •Структуры и функции.
- •Динамическая работа с памятью.
- •Распределение памяти компьютера.
- •Универсальный (обобщенный) указатель void
- •Свойства указателя void
- •Выделение памяти из кучи.
- •Особенности realloc().
- •Освобождение динамической памяти.
- •Правила работы с динамической памятью.
- •Варианты заданий. Общие требования
Большое Домашнее Задание (БДЗ)
Тема: Использование динамической памяти при работе со структурами
Теория
Пользовательские типы данных: Структурный тип данных (structures)
В отличии от простых типов, которые заранее определенны в языке Си , сложные типы определяет сам пользователь (отсюда и название пользовательские типы).
Cтруктура - это совокупность элементов, каждый из которых может иметь любой тип кроме функции. В отличии от массива, который состоит из элементов одинакового типа, структура может состоять из элементов разных типов
Объявление структуры:
struct имя_типа { список определений };
struct (служебное слово)– спецификатор структурного типа.
Пример: определение нового типа date , состоящего из 3-х полей (элементов):
struct date
{ int day; // день
int month; // месяц
int year; // год
};
Написав подобное определение, можно пользоваться новым типом данных - создавать переменные, указатели, массивы, и так далее.
Название нового типа sruct date
Данное определение не выделяет никакой памяти, а лишь задает структуру нового типа данных.
struct date1
{ int day; // день
char* month; // месяц
int year; // год
};
Если структура используется только в одном файле, то можно совместить описание типа и создание переменных (выделение памяти).
Пример: Выделение памяти под переменные
struct date d1={01,12,2014};
struct date1 d2={01, «января»,2014};
Что происходит при инициализации:
Создание полей-переменных
Присваивание начальных значений
Определение структуры включает
2 Этапа:
определить структурный тип (задать типы-размеры элементов);
определить структурный объект (выделить память).
Примеры использования нового типа для создания различных объектов:
struct date data; // переменная
struct date1 d[1000]; // массив
struct date *pd ; // указатель
При необходимости структуры можно инициализировать, помещая вслед за описанием список начальных значений элементов.
Оператор typedef
typedef позволяет назначать имена типам данных (переименовывать типы).
Он записывается в следующем виде:
typedef тип имя;
Пример:
typedef int INTEGER;
Теперь можно объявить переменные:
INTEGER а, b;
Такое объявление аналогично привычному: int a, b;
Другими словами, INTEGER можно использовать как синоним ключевого слова int.
При работе со структурами оператор typedef вводит структурный тип и присваивает ему обозначение (имя) :
Пример:
typedef struct date date_num;
typedef struct date1 date_str;
Разрешается вкладывать структуры друг в друга.
Пример : Определить структуру и переименовать ее.
Каждая позиция склада содержит разнотипную информацию о товаре, например: название, цену, количество, дату поступления.
typedef struct tovar
{char* name ; // наименование
double price ; // цена
int vol ; // количество
date_num in_date ; // дата поступления (вложенная структура)
}sklad_1;
После такого определения структурные объекты могут определяться как с помощью типа sklad_1 , так и с помощью типа struct tovar
Пример :
// определены 3 структуры типа sklad_1
sklad_1 tea, meat, broad ;
// определены 2 структуры типа struct tovar
struct tovar pen, book ;
Обратите внимание : при введении структурного типа с помощью typedef в определении объектов не указывается спецификатор struct
Пример : Определить структуру и выделить память под переменную.
struct tovar
{char* name ; // наименование
double price ; // цена
int vol ; // количество
date_num in_date ; // дата поступления
}food;
Такое определение определяет новый структурный тип и выделяет память под переменную с именем food типа struct tovar.
Разумеется, проделывать такое в файле-заголовке не следует, иначе транслятор попытаться создать переменные с одинаковыми именами везде, куда вы этот заголовок включите.
Часто говорят, что переменная food является объектом структурного типа.
Определение структуры безымянного типа
Следующий вариант определения структур является некоторым упрощением приведенных выше вариантов. Можно определять структуры, вводя «внутреннее строение» (т.е. элементы структуры), но не вводя его имени.
Безымянный структурный тип обычно используется для однократного определения структур.
Пример структуры для введения данных о компьютере.
struct
{ char processor [7] ;
int frequency ;
int memory ;
int disk ;
} IBM , DEC, COMPAQ ;
После такого определения программист может работать со структурными объектами IBM , DEC, COMPAQ , но нельзя создавать другие объекты позднее.