- •Содержание
- •Лекция 1. Общее знакомство
- •Происхождение языка Си
- •Достоинства языка Си
- •Будущее языка Си
- •Использование языка Си
- •Использование текстового редактора для подготовки программ
- •Исходные и выполняемые файлы
- •Пример простой программы на языке Си
- •Пояснения к программе
- •Первый просмотр
- •Второй просмотр
- •Структура простой программы
- •Дополнительный пример
- •Лекция 2. Данные, символьные строки, директива #define
- •Основные типы данных
- •Описание различных типов, переменные и константы
- •Символьные строки
- •Препроцессор языка Си
- •Лекция 3. Операции
- •Основные операции
- •Операция вычитания: -
- •Операция изменения знака: -
- •Операция умножения: *
- •Операция деления: /
- •Дополнительные операции
- •Операция деления по модулю: %
- •Операция уменьшения: --
- •Перечень операций языка Си
- •Операции, уровень приоритета которых равен 1
- •Операция уменьшения: --
- •Операция вычитания: -
- •Операции, уровень приоритета которых равен 5
- •Операции, уровень приоритета которых равен 6
- •Операции, уровень приоритета которых равен 7
- •Операция, уровень приоритета которой равен 8
- •Операция, уровень приоритета которой равен 12
- •Операция логическое или: ||
- •Операция, уровень приоритета которой равен 13
- •Операция условный оператор: ?
- •Операция, уровень приоритета которой равен 14
- •Операция присваивания
- •Операция, уровень приоритета которой равен 15
- •Операция запятая: ,
- •Лекция 4. Операторы
- •Выражения
- •Простейшие выражения
- •Операторы
- •Составные операторы
- •Оператор цикла while
- •Изучение и использование функций printf( ) и scanf( )
- •Применение функции scanf( )
- •Лекция 5. Преобразование типов
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •Операция приведения
- •Неявное преобразование типа
- •Арифметические преобразования
- •Явные преобразования типов
- •Синтаксис типов
- •Лекция 6. Функции и переключение ввода-вывода
- •Ввод и вывод одного символа
- •Чтение одной строки
- •Чтение файла
- •Переключение и работа с файлами
- •Переключение ввода
- •Комбинированное переключение
- •Операционные системы, отличные от oc unix
- •Лекция 7. Выбор вариантов
- •Выбор вариантов
- •Оператор if
- •Расширение оператора if
- •Операции отношения
- •Что такое истина
- •Осложнение с понятием истина
- •Логические операции
- •Операция условия: ?:
- •Множественный выбор
- •Лекция 8. Циклы и другие управляющие средства. Структурное программирование
- •Структурное программирование
- •Цикл с предусловием
- •Цикл со счетчиком
- •Цикл с постусловием
- •Другие управляющие операторы
- •Оператор break
- •Оператор continue
- •Оператор goto
- •Лекция 9. Функции
- •Создание и использование функций
- •Аргументы функции
- •Возвращение значений
- •Локальные переменные
- •Нахождение адресов
- •Указатели, первое знакомство
- •Операция косвенной адресации *
- •Описание указателей
- •Подведем итоги по указателям
- •Функции с переменным количеством аргументов
- •Лекция 10. Классы памяти и разработка программ
- •Классы памяти и область действия
- •Автоматические переменные
- •Внешние переменные
- •Статические переменные
- •Внешние статические переменные
- •Регистровые переменные
- •Лекция 11. Препроцессор языка Си
- •Общие сведения
- •Символические константы: #define
- •Замена идентификаторов
- •Использование аргументов с #define
- •Макроопределение или функция?
- •Включение файла: #include
- •Условная компиляция
- •Вспомогательные директивы Номер строки и имя файла
- •Реакция на ошибки
- •Пустая директива
- •Встроенные макроимена
- •Лекция 12. Массивы и указатели
- •Указатели и массивы
- •Массивы
- •Указатели
- •Динамические объекты
- •Создание динамических объектов
- •Доступ к динамическим объектам
- •Время жизни динамического объекта
- •Связь между указателями и массивами
- •Строки - дополнительные сведения о тесной связи между указателями и массивами
- •Инициализация массивов и классы памяти
- •Функции, массивы и указатели
- •Операции с указателями
- •Лекция 13. Символьные строки и функции над ними
- •Строковые константы
- •Массивы символьных строк и их инициализация
- •Массив и указатель: различия
- •Указатели и строки
- •Ввод-вывод строк
- •Обработка строк
- •Лекция 14. Структуры
- •Определение структурных переменных
- •Доступ к компонентам структуры
- •Поля битов в структурах
- •Объединения
- •Перечисления
- •Переменные структуры
- •Указатели и структуры
- •Массив структур
- •Переименование типов
- •Лекция 15. Библиотека языка Си и файлы ввода-вывода
- •Стандартные библиотечные функции
- •Доступ в библиотеку языка Си
- •Открытие файла: fopen( )
- •Закрытие файла: fclose( )
- •Текстовые файлы с буферизацией
- •Ввод-вывод текстового файла: getc( ), putc( )
- •Ввод-вывод файла: fprintf( ), fscanf( ), fgets( ), fputs( )
- •Функции fprintf( ) и fscanf( )
- •Функция fgets( )
- •Функция fputs( )
- •Функция fseek( )
- •Распределение памяти Функция malloc( )
- •Функция calloc( )
- •Лекция 16. Функции в примерах
- •Функция получения случайных чисел
- •Поиск узлов из простых чисел
- •Матрица инцидентности
- •Структуры данных
- •Очереди
- •Связанные списки
- •Все операции со стеком
- •Подведем итог
- •Дополнения
- •Литература
Лекция 12. Массивы и указатели
Указатели и массивы. Массивы. Указатели. Динамические объекты. Создание динамических объектов. Доступ к динамическим объектам. Строки - дополнительные сведения о связи между указателями и массивами. Инициализация массивов и классы памяти. Функции. Операции с указателями.
Указатели и массивы
Допустимо бесконечно большое число различных типов указателей и массивов. Далее следуют типовые примеры.
Указатель на основной тип:
char *p;
Переменная р является указателем на символ, т.е. этой переменной должен присваиваться адрес символа.
Указатель на указатель:
char **t;
Переменная t - указатель на указатель символа.
Одномерный массив:
int a[50];
Переменная а - массив из 50 целых чисел.
Двумерный массив:
char m[7][50];
Переменная m - массив из семи массивов, каждый из которых состоит из 50 символов.
Массив из семи указателей:
char *r[7];
Массив r состоит из указателей на символы.
Указатель на функцию:
int (*f)();
f - указатель на функцию, возвращающую целое значение.
Массивы
Массив является сложным объектом, состоящим из объектов-компонентов, называемых элементами одного и того же типа. Простые определения массива имеют вид
Тип данных x[n1][n2]...[nk]
Где x - идентификатор, определяемый в качестве имени массива, а ni - размерности массива. Массив x называется k-мерным массивом с элементами типа тип данных. Элементы i -го измерения имеют индексы от 0 до ni-1. Тип элемента массива может быть одним из основных типов, типом другого массива, типом указателя (pointer), типом структуры ( struct ) или типом объединения ( union ). Хотя элементы массива не могут быть функциями, они могут быть указателями на функции. Ниже приведены некоторые примеры определений массива:
int page[10]; /* одномерный массив из 10
элементов, перенумерованный с 0 до 9 */
char line[81];
float big[10][10], sales[10][5][8]; /*двумерный
массив и трехмерный массив*/
Ссылки на элемент k-мерного массива x делаются с помощью следующего обозначения:
x[i1][i2]...[ik]
где ij - целое выражение, при этом 0<=ij<=nj-1, а nj - максимальное значение j -го индекса массива x. Например:
page[5]
line[i+j-1]
big[i][j]
Указывая только первые p индексов, можно ссылаться на k-p -мерный подмассив k-мерного массива (p<=k), например,
sales[i] /* ссылка на двумерный подмассив массива
sales */
sales[i][j] /* ссылка на одномерный подмассив */
sales[i][j][k] /* ссылка на элемент массива*/
Указатели
Указателем называется компонент заданного типа, являющийся ссылкой на некоторую область памяти. Определение указателя имеет следующий вид:
тип-данных *id1, *id2, *_, *idn
Тип переменных id1, id2, _, idn определяется как тип указателей на тип-данных. Эти переменные служат ссылками на объекты типа тип-данных. Этот тип называется базовым типом переменных-указателей. Ниже приведены несколько примеров определений указателей:
int *pi, *qi;/* указатели на целые объекты */
char *c; /* указатель на символьный объект */
Динамические объекты
Указатели используются при создании и обработке динамических объектов. Заранее определяемые объекты создаются с помощью определений. Динамические объекты, в отличие от заранее определяемых, создаются динамически и явно в процессе выполнения программы. Для создания динамических объектов служат функции malloc и calloc. В отличие от заранее определенных объектов, число динамических объектов не фиксировано тем, что записано в тексте программы, - по желанию динамические объекты могут создаваться и уничтожаться в процессе ее выполнения. Динамические объекты, в отличие от заранее определенных, не имеют имен, и ссылка на них выполняется с помощью указателей.
Значение 0 может быть присвоено указателям любого типа. Это значение показывает, что данный указатель не содержит ссылки на какой-либо объект. Попытка использовать это значение для обращения к объекту может привести к ошибке, но только в операционных системах с защитой памяти. По соглашению, для обозначения константы с нулевым значением используется идентификатор NULL, описание которого находится в библиотеке stddef.h и является системозависимым.