- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция 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).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Объявление указателей.
Язык Си позволяет вам объявить объект, который будет содержать указатель на объекты любого примитивного или сложного типа данных. Для определения указателя надо использовать символ * в объявлении объекта.
Синтаксис объявления указателя аналогичен объявлению переменных остальных типов:
Класс_памяти тип_данных * имя;
Например:
int * pt ; /*указатель на целое значение*/
char * cp ; /*указатель на символ*/
float * t /*указатель на значение с плавающей точкой*/
В результате переменная pt будет указывать на объекты типа int, cp – char, t – float (заметьте, что символ * не включается в имя переменной).
Модификатор const.
При объявлении переменных, к указателям, как и к другим типам данных может быть применён модификатор const. Этот модификатор означает, что значение переменной не может быть изменено, и переменная всегда сохраняет значение, заданное в процессе инициализации. Т.е., если в программе присутствует следующее определение:
const char* p=0x5FFF;
то переменная p будет сохранять заданное при инициализации значение в течение всего времени существования переменной. Поэтому если в программе встретится, например, такая строка:
p++;
то компилятор выдаст ошибку.
Переменные с типом указатель, созданные с модификатором const называются константными указателями.
Операции.
При работе с указателями часто применяются следующие операции:
& - получение адреса переменной.
* - операция косвенной адресации.
[] – операция индексации.
Операция & применима к переменной любого типа. Она просто возвращает адрес памяти, в которой хранится значение переменной.
Пример:
char i;
char* p;
p=&i;
В результате, в переменную p запишется адрес участка памяти, в котором хранится значение переменной i. Заметим, что операция & применима и к самим указателям:
char *p;
char **p2;
p2=&p;
Полное название типа переменной p2 здесь – «указатель на указатель на char».
Операция * применима к переменным типа указатель, она возвращает объект (переменную, функцию), на который ссылается данный указатель. В сочетании с операцией присваивания, она позволяет записывать некоторое значение в память или же читать некоторое значение из определённой ячейки памяти.
Пример:
char i;
char *p;
p=&i; // В переменной p теперь хранится адрес переменной i.
*p=3; // Запишем число 3 по адресу хранимому, в переменной p.
В результате выполнения этой программы, в ячейку памяти по адресу, равному адресу переменной i, запишется число 3. Т.е. выполнение этой программы просто эквивалентно записи числа 3 в переменную i.
Аналогично производится чтение памяти:
char i, j;
char *p;
p=&i; // В переменной p теперь хранится адрес переменной i.
j=*p; // В переменную j записываем значение ячейки памяти
// по адресу p.
Выполнение этой программы эквивалентно записи значения переменной i в переменную j.
Тип объекта, возвращаемого операцией *, тождественен типу, на который указывает указатель.. Это значит, что если указатель p имеет тип char* (как в примере), то операция *p вернёт переменную типа char. Если же он имел бы тип int*, то результатом *p явилась бы переменная типа int, содержащая в себе значение типа int.
Не следует путать операцию * и символ * в объявлении типа переменной, как показано в примерах выше, это 2 разные вещи. Синтаксис языка C при объявлении типа указатель иногда сбивает с толку, например объявление:
char c,*p;
создаст 2 переменные – c типа «char» и p типа «указатель на char». Тем не менее, это выражение всё равно остаётся объявлением переменной, к операции косвенной адресации символ <*> здесь никакого отношения не имеет.
Операция [] аналогична операции * и позволяет читать значения из памяти или записывать значения в память. Отличие состоит в том, что с её помощью сразу можно задавать смещение на i позиций, т.е. запись i=p[3]; эквивалентна записи i=*(p+3); (про применение операций + и – к указателям смотрите ниже).