
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Операторы [ ] u ()
- •Приоритеты в с
- •Выражения
- •Преобразование типов в выражениях
- •Принудительные преобразования
- •Пробелы и круглые скобки
- •Сокращенные операторы в с
- •Операторы управления программой
- •Истина и ложь в с
- •Операторы выбора
- •Вложенные if
- •Лесенка if-else-if
- •Оператор ?
- •Вложенные операторы switch
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Метки и goto
- •Функции
- •Оператор return
- •Выход из функции
- •Возвращаемые значения
- •Значения, возвращаемые функцией main()
- •Правила видимости для функций
- •Аргументы функции
- •Передача по значению и передача по ссылке
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Аргументы функции main()
- •Функции, возвращающие нецелые значения
- •Использование прототипов функции
- •Прототипы стандартных библиотечных функций
- •Создание прототипов функций, не имеющих параметров
- •Возврат указателей
- •Рекурсия
- •Сопоставление классического и современного объявления параметров
- •Указатели на функции
- •Особенности реализации
- •Параметризированные функции и функции общего назначения
- •Эффективность
- •Массивы
- •Одномерный массив
- •Создание указателя на массив
- •Передача одномерных массивов в функции
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Инициализация массива
- •Инициализация безразмерных массивов
- •Пример программы игры в крестики-нолики
- •Указатели
- •Указатели - это адреса
- •Переменные-указатели
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Динамическое выделение и указатели
- •Указатели на константы
- •Указатели на константы
- •Указатели на константы
- •Указатели и массивы
- •Указатели на символьные массивы
- •Массивы указателей
- •Указатели на указатели - многочисленное перенаправление
- •Инициализация указателей
- •Указатели на функции
- •Проблемы, связанные с указателями
- •Структуры, объединения и определяемые пользователем типы
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Программа инвентаризации
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование sizeof для обеспечения переносимости
- •Ввод, вывод, потоки и файлы
- •Потоки и файлы
- •Текстовые потоки
- •Двоичные потоки
- •Консольный ввод/вывод
- •Чтение и запись символов
- •Чтение и запись строк: gets() и puts()
- •Форматированный консольный ввод/вывод
- •Печать символов
- •Вывод чисел
- •Вывод адресов
- •Спецификатор %n
- •Модификаторы формата
- •Спецификатор минимума ширины поля
- •Спецификатор точности
- •Выровненный вывод
- •Работа с другими типами данных
- •Модификаторы * u #
- •Спецификаторы формата
- •Ввод чисел
- •Ввод беззнаковых целых
- •Чтение отдельных символов с помощью scanf()
- •Чтение строк
- •Ввод адреса
- •Спецификатор %n
- •Использование множества сканирования
- •Пропуск нежелательных специальных символов
- •Обычные символы в управляющей строке
- •В scanf() следует передавать адреса
- •Модификаторы формата
- •Подавление ввода
- •Файловая система ansi с
- •Указатель на файл
- •Открытие файла
- •Запись символа
- •Чтение символа
- •Использование fopen(), getc(), putc() и fclose()
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Fseek() и произвольный доступ
- •Удаление файлов
- •Работа с консолью
- •Препроцессор и комментарии
- •Директивы условной компиляции
- •Использование defined
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Вывод адресов
Если необходимо вывести адрес, следует использовать %р. Данный спецификатор формата приводит к тому, что компьютер отображает адрес в формате, совместимом с типом адресации, используемой на компьютере. Следующая программа выводит адрес sample: #include <stdio.h> int sample; int main(void) { printf("%p", &sample); return 0; }
Спецификатор %n
Спецификатор формата %n отличается от других спецификаторов. Вместо того, чтобы говорить printf() о необходимости вывода чего-либо, он заставляет printi() инициализировать переменную, на которую указывает аргумент, соответствующий данному спецификатору, значением, равным числу уже выведенных символов. Другими словами, значение, соответствующее спецификатору формата %n, должно быть указателем на переменную. После того как printf() завершит работу, переменная будет содержать число выведенных символов до момента, когда был встречен %n. Стоит изучить следующую программу, чтобы понять работу данного спецификатора: #include <stdio.h> int main(void) int count; printf ("this%n is a test\n", &count); printf ("%d", count); return 0; } Программа выводит this is a test за числом 4. Спецификатор формата %n, как правило, используется для выполнения динамического форматирования.
Модификаторы формата
Многие спецификаторы формата могут использовать модификаторы, немного изменяющие способ представления. Например, можно определить минимальную ширину поля, число символов, отводимых под десятичные цифры и левый отступ. Модификатор формата идет между знаком % и кодом формата.
Спецификатор минимума ширины поля
Целое число, помещаемое между знаком % и кодом формата, рассматривается как спецификатор минимума ширины поля. Он добавляет к выводу пробелы для обеспечения некоторой минимальной длины. Если строка чисел длиннее, чем этот минимум, она будет выводиться без отсечений. По умолчанию для достижения необходимой длины строка дополняется пробелами. Если необходимо выводить не пробелы, а нули, следует поставить ноль перед спецификатором ширины поля. Например, %05d будет выводить числа, длиной меньше пяти символов с впереди стоящими нулями, чтобы полная длина была пять. Следующая программа демонстрирует использование спецификатора минимума длины поля: #include <stdio.h> int main (void) { double item; item = 10.12304; printf ("%f\n", item); printf("%10f\n", item); printf("%012f\n", item); return 0; } В результате работы данной программы получаем: 10.123040 10.123040 00010.123040
Модификатор минимума ширины поля, как правило, используется для создания таблиц, в которых элементы строк имеют одинаковый отступ. Например, следующая программа создает таблицу квадратов и кубов чисел от 1 до 19: #include <stdio.h> int main(void) { int i; /* вывод таблицы квадратов и кубов */ for(i=1; i<20; i++) printf("%8d %8d %8d\n", i, i*i, i*i*i); return 0; } В результате работы программы получим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 |
1 8 27 64 125 216 343 512 729 1000 1331 1728 2197 2744 3375 4096 4913 5832 6859 |