- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции main().
- •Пример простейшей программы
- •Алфавит, синтаксис и семантика
- •Алфавит языка Си
- •Понятие о типе
- •Система типов языка Си Система типов языка Си
- •Понятие об объекте
- •Лексемы
- •Зарезервированные слова
- •Идентификаторы
- •Литералы
- •Целочисленные литералы
- •Литерал вещественного типа
- •Символьные литералы
- •Строковый литерал
- •Переменные
- •Символические константы в языке Си
- •Операторы, выражения и инструкции. Общие сведения.
- •Классификация операторов
- •Приоритет и ассоциативность операторов.
- •Побочные эффекты и вычисления выражений
- •Порядок вычисления выражений
- •Арифметические операторы и выражения
- •Унарные операторы
- •Бинарные операторы
- •Преобразования типа при выполнении бинарных операторов
- •Автоматическое преобразование типов
- •Явное преобразование типа
- •Математические функции
- •Оператор присваивания и инструкция присваивания
- •Простой оператор присваивания
- •.Множественное присваивание
- •Составной оператор присваивания
- •Преобразование типа при присваивании
- •Начальные сведения об указателях. Выходные параметры функции
- •Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •Логические операторы
- •Поразрядные операторы
- •Условные выражения (оператор ?:)
- •Оператор запятая
- •Оператор sizeof
- •Составная инструкция
- •Инструкция ifelse
- •Полная и сокращенная формы инструкции if
- •Вложенные инструкции if
- •Инструкция switch
- •Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •Функциональные компоненты цикла
- •Арифметические и итерационные циклы
- •Задачи, приводящие к арифметическим циклам
- •Задачи, приводящие к итерационным циклам
- •Циклические управляющие инструкции
- •Цикл, управляемый инструкцией for
- •Цикл, управляемый инструкцией while
- •Цикл, управляемый инструкцией do … while
- •Цикл с выходом
- •Вложенные циклы
- •Понятие о варианте и инварианте цикла
- •Объявления и определения (расширенное рассмотрение)
- •Спецификаторы объявления
- •Спецификаторы класса памяти.
- •Квалификаторы типа
- •Спецификаторы типа
- •Использование спецификаторов
- •Описатели
- •Использование зарезервированного слова typedefдля объявления синонимов типов
- •Функции
- •Понятие об абстракции и инкапсуляции
- •Функция языка Си и процедурная абстракция
- •Понятие о функции
- •Назначение функций
- •Определение функции
- •Функции, возвращающие и невозвращающие значение
- •Вызов функции. Передача параметров по значению
- •Внешние переменные и процедурная абстракция
- •Понятие о прототипе. Компиляция
- •Старый стиль определения функции
- •Массивы в стиле языка с89
- •Определение и объявление массивов
- •Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.
- •Определение и инициализация двумерных массивов
- •Операции с массивами
- •Размещение массивов в оперативной памяти
- •Указатели
- •Операторы разыменования и взятия адреса
- •Области применения указателей
- •Нулевой указатель
- •Определение указателя
- •Недействительный указатель
- •Операции с указателями
- •Дополнительные сведения о разыменовании указателей
- •Присваивание указателей
- •Операция взятия адреса для указателя. Указатели на указатели
- •Указатели и операция индексирования
- •Арифметические операции с указателями
- •Сравнение указателей
- •Указатели и динамическая память
- •Функция malloc
- •Функция calloc
- •Функция realloc
- •Функция free
- •Указатели – параметры функций. Имитация передачи по ссылке
- •Указатели на функцию
- •Инициализация указателя на функцию
- •Операции с указателями на функцию
- •Табулирование произвольной функции одного переменного
- •Использование стандартной функции qsort
- •Указатели и массивы
- •Строковый литерал
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Ввод строк
- •Функция scanf()
- •Опасная функция gets()
- •Использование функции fgets()
- •Вывод строк
- •Функция printf()
- •Функция puts()
- •Функция fputs()
- •Библиотечные функции для обработки строк
- •Функция strlen()
- •Функции strcpy()иstrncpy()
- •Функции strcat() иstrncat()
- •Функция strcmp()
- •Массивы строк
- •Структуры
- •Объявление структур
- •Обращение к полям структуры
- •Инициализация структур
- •Операции над структурами
- •Массивы структур
- •Объявление массива структур
- •Идентификация элементов массива структур
- •Работа с внешними устройствами
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Указатель файла
- •Функция fopen()
- •Функция fclose()
- •Построковый ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Прямой доступ к файлу
- •Функция fseek()
Области применения указателей
Можно выделить следующие основные области применения указателей:
Использование указателей в качестве параметров функций для возврата результатов вычислений.
Работа с объектами, размещенными в динамической памяти.
Замена манипуляций со сложными объектами данных манипуляцией с адресами этих объектов.
Нулевой указатель
Нулевой указатель – это такое значение указателя, которое не может быть адресом переменной или функции. Наиболее часто используемыми представлениями нулевого указателя как константы являются 0, 0LиNULL. Считается хорошим стилем программирования всем указателям, которые не работают с реальными объектами (переменными) или функциями, было присвоено значениеNULL
Определение указателя
В определении указателя используется оператор разыменования “*”. Упрощенный формат определения указателя имеет следующий вид:
type*name;
Здесь type – спецификация типа, определяющая тип объекта, адрес которого будет храниться в указателе;name – имя (идентификатор) указателя. Заметим, что иногда тип объект, на который установлен указатель, называют базовым типом. Как уже отмечалось, в записи определений используется синтаксис выражений. Продемонстрируем это положение на примере. Пусть имеется следующее определение указателя:
int *ptr;
Здесь type– это int, аptr–name. Приведенное выше определение можно “прочитать”, используя синтаксис выражений, следующим образом. Применение оператора разыменования к имениptrпозволяет получить объект типаint. Отсюда следует тот факт, чтоptrявляется именем указателя
Во время определения указатель может быть инициализирован. В качестве инициализаторов указателя при его объявлении могут использоваться:
Нулевой указатель.
Указатель-переменная
Указатель-выражение.
Приведем примеры инициализации указателей во время их определения.
/* Примеры инициализации указателей при их определении */ int* p = NULL; /* Инициализация указателя p нулевым указателем*/ int* p2 = p; /* Инициализация указателя p2 значением существующего указателя p*/ int n = 5; int* p3 = &n; /* Инициализация указателя значением указателя-выражения &n */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . */
Недействительный указатель
Недействительный указатель (invalidpointer) – это ненулевой указатель, содержимое которого не является адресом переменной или функции. Любое использование недействительного указателя (разыменование такого указателя, сравнение его со значениемNULL, передача его в качестве параметра в функцию) в стандарте языка Си приводит к неопределенному поведению программы. Рассмотрим возможные причины появления недействительных указателей.
Имеется ряд причин появления недействительных указателей:
Отсутствие инициализации указателей,
Ошибки, допущенные при преобразовании целочисленных значений к указательному типу.
Освобождение динамической памяти.
Ошибки, допущенные при использовании адресной арифметики.
Здесь ограничимся рассмотрением только первой из перечисленных выше причин. Одна из наиболее распространенных причин появление недействительных указателей связана с отсутствием инициализации указателей. Ниже приводится типичный пример программного кода, в котором используется неинициализированный указатель.
/* Ошибка в программном коде*/
double x; double* pn; x = modf(10.2, pn); // Использование неинициализированного // указателя /* .............................*/
