- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция 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 в следующем виде:
struct ИмяСтруктуры ИмяПеременной;
Например:
struct MyStruct
{
int item1;
int item2;
};
struct MyStruct var1;
Таким образом, переменная с типом структура может быть объявлена в любом месте программы.
Доступ к элементам структуры.
Для доступа к элементам структуры существуют две основных операции: . и ->
Операция <.> обеспечивает доступ к какому либо элементу структуры при известной переменной, реализующей структуру. Например, если мы имеем переменную
struct MyStruct var1;
то доступ к её полю item1 будет осуществляться с помощью оператора <.> :
i=var1.item1;
Операция -> используется для доступа к элементу структуры при заданном указателе на структуру.
Например, если в программе имеется некоторый указатель на структуру MyStruct:
struct MyStruct * p1;
то получить значение её элемента item1 можно с помощью следующей записи:
i=var1->item1;
Заметим, что эта запись эквивалентна следующей записи с использованием операции<.> и операции косвенной адресации <*>:
i=(*var1).item1;
Существуют также 2 дополнительных операции .* и ->*, отвечающие за получение значения переменной по указателю, записанному в структуре, но эти операции легко могут быть переписаны с помощью операции косвенной адресации *, причём такая запись улучшает читаемость программы:
var1.*pItem1 эквивалентно *(var1.pItem1)
p1->*pItem1 эквивалентно *(p1->pItem1)
Объединение (union).
Объединение (union) является производным (сложным) типом данных, представляющим собой набор переменных, хранящихся в памяти в одних и тех же ячейках. Синтаксис определения структуры выглядит следующим образом:
union ИмяОбъединения
{
тип элемент1;
тип элемент2;
}ИмяПеременной;
где ИмяОбъединения – некоторый идентификатор объединения,
ИмяПеременной – имя создаваемой переменной.
Внутри фигурных скобок находится список переменных – элементов (членов) структуры, разделённых точкой с запятой. Аналогично синтаксису определения перечисления, ИмяОбъединения и ИмяПеременной могут быть опущены.
Пример:
union un1
{
int i;
char str[5];
double j;
}var1;
В результате выполнения такого определения будет создано объединенение с идентификатором un1 и переменная var1 типа объединение st1. Её элементы будут размещены в памяти следующим образом:
Адрес начала переменной var1( = &var1)
↓
B0 |
B1 |
B2 |
B3 |
B4 |
B5 |
B6 |
B7 |
int i; |
|
|
|||||
char str[5]; |
|
||||||
double j; |
При записи какого-либо значения в одно из полей объединения, значения остальных его элементов также изменятся, т.к. значения этих переменных хранятся в одной и той же области памяти.
Доступ к элементам объединения и работа с ними в программе осуществляется аналогично работе с элементами структуры. Побитовое описание элементов объединения также осуществляется аналогично работе со структурами.