- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция main и её параметры.
- •Директивы препроцессора (прекомпилера).
- •Объявление указателей.
- •Модификатор const.
- •Операции.
- •Указатели на различные типы.
- •Указатель на void.
- •Применение указателей для передачи данных между функциями.
- •Массивы.
- •Индексация массивов.
- •Хранение массива в памяти. Адреса элементов. Хранение массива в памяти.
- •Массивы и константные указатели.
- •Статическое и динамическое выделение памяти.
- •Функции calloc, malloc, free
- •Функция realloc
- •Передача массивов в качестве аргументов функции.
- •Указатели на функции.
- •Библиотеки функций.
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Работа со строковыми данными (стрингами). Представление строковых данных в языке c.
- •Функции работы со строками.
- •Потоковый ввод-вывод
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Функции работы с файлами.
- •Потоковый ввод-вывод
- •Работа с потоками
- •Курсор.
- •Ввод-вывод отдельных символов и строк.
- •Форматированный ввод-вывод информации в файл.
- •Блочный потоковый ввод-вывод
- •Смена текущей позиции в файле. Проверка конца файла.
- •Функции доступа к файлам нижнего уровня.
- •Методы сортировки данных.
- •Введение
- •Сравнение методов сортировки
- •Программная реализация алгоритмов сортировки
- •Метод пузырька.
- •Метод обмена.
- •Метод вставки.
- •Метод Шелла.
- •Метод кучи (бинарной кучи).
- •Очередь
- •Линейный список
- •Физическое (машинное) представление линейных списков
- •Программные реализации структур данных. Стек. Реализация в виде массива.
- •Стек. Связанное представление.
- •Очереди. Реализация в виде массива.
- •Дерево. Связанное представление.
- •Рекурсивный вызов функций.
- •Структуры. Объединения. Перечисления.
- •Перечисление (enum).
- •Производные типы данных.
- •Структура (struct).
- •Побитовое описание полей структуры.
- •Объявление переменных, реализующих структуру.
- •Доступ к элементам структуры.
- •Объединение (union).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Инициализация структур и объединений.
При создании переменной типа структура она может быть проинициализирована набором данных, перечисленных через запятую внутри фигурных скобок. Синтаксис записи очень похож на инициализацию массивов. Например, структура, описывающая трёхмерную точку, может быть проинициализирована следующим образом:
struct Point
{
int x;
int y;
int z;
}
p1 =
{1,2,3};
Если структура уже описана, то для описания и инициализации новой переменной можно воспользоваться сокращённой записью:
struct Point p2 = {3,4,5};
Инициализация более сложных структур, в т.ч. с элементами-массивами и вложенными структурами можно осуществляется аналогично инициализации многомерных массивов, т.е. в состав набора данных инициализирующего структуру (заключённого в фигурные скобки) включают вложенные наборы данных, например:
struct STOCK_INFO
{
char Name [32]; // Наименование фирмы
int Quantity; // Количество
int CustomersIDs[10]; // Идентификаторы покупателей
struct Prices // Цены
{
int MinPrice;
int MaxPrice;
int AveragePrice;
}
}
сurrent =
{
“IBM Inc“, // Наименование фирмы
45, // Количество
{0,1,2,3,4,5,6,7,8,9}, // Идентификаторы покупателей
{10,100,48} // Цены
} ;
Как видим, в данном случае элементы-массивы инициализируются либо константой-строкой (для Name) либо вложенным набором элементов (для CustomersIDs). Вложенная структура (Prices) также инициализируется вложенным набором элементов.
В принципе, при инициализации сложных структур можно просто перечислить их элементы через запятую, не используя сложенных наборов данных, однако при этом очень сложно определить какое инициализирующее значение относится к какому элементу.
Аналогичным образом можно инициализировать и объединения, однако для объединений при инициализации надо указывать только значение для его первого элемента. Например:
union CompInt
{
int i;
struct
{
short LoWord;
short HiWord;
}
}
MyVal = {10}; // Значение для элемента i;
Сравните это со следующей записью:
union CompInt
{
struct
{
short LoWord;
short HiWord;
}
int i;
}
MyVal = {{10,0}}; // Значения для элементов LoWord и HiWord;
Выгода от использования структур
Резюмируя всё вышесказанное можно перечислить следующие положительные стороны использования структур:
Структурированная запись данных, с которыми работает программа, значительно улучшает её читаемость. Структуры полнее отображают смысл данных.
Структурированные данные легче передавать в функции – вместо набора параметров достаточно передать один параметр – структуру.
Использование структур упрощает расширение программы. При необходимости, можно просто добавить ещё один элемент в структуру, больше ничего не изменяя в программе – новый параметр будет передаваться между функциями внутри структуры. Если же использовать для нового элемента отдельную переменную, то программисту придётся изменить описание всех функции, работающие с этими данными дабы обеспечить передачу в функции нового параметра.
Работать со структурами и объединениями не сложнее чем с основными типами. Принципы работы остаются те же самые, но в начале типа надо добавлять ключевые слова struct или union. При объявлении же производных типов в виде пользовательского типа (с помощью typedef) эти различия и вовсе пропадают.
К структурам и объединениям, также как и к основным типам, применимы операторы взятия адреса переменной(&), и оператор определения длины переменной или типа (sizeof). В качестве операнда оператора sizeof может быть использована как сама переменная, так и производный тип:
i=sizeof(MyVar);
j=sizeof(struct MyStruct);
k=sizeof(union MyUnion);
При работе с файлами, потоками, памятью, можно работать с содержимым структуры как с блоком памяти фиксированной длины. Например, сохранить содержимое всей структуры в файл можно с помощью функции блочной записи в файл, которой сообщают адрес структуры в памяти (взятый с помощью оператора &) и её длину (полученную с помощью оператора sizeof). Например:
write(FileHandle, &MyStruct, sizeof(MyStruct));
Инициализация переменных, структур, массивов.