Глава 30: Расширенная быстрая справка по языку C ================================================= В этой главе представлен расширенный справочный материал по языку C, охватывающий более глубокие концепции, включая работу с памятью, продвинутые операции с указателями, обработку ошибок, макросы и другие важные аспекты, необходимые для разработки на C. .. note:: Для работы с приведёнными функциями и конструкциями требуются следующие заголовочные файлы: - ``#include `` — ввод/вывод, работа с файлами. - ``#include `` — память, преобразования, `malloc()`. - ``#include `` — работа со строками. - ``#include `` — обработка ошибок. Расширенный Cheat Sheet: Язык C ------------------------------- .. list-table:: :header-rows: 1 :widths: 15 25 60 * - Концепция - Ключевые слова / Пример - Описание * - **Объявление переменных** - ``int x = 10;``, ``const float PI = 3.14;`` - Объявление переменной определённого типа и инициализация. ``const`` делает переменную неизменяемой. * - **Типы данных** - ``int``, ``float``, ``double``, ``char``, ``void``, ``short``, ``long``, ``unsigned`` - Основные встроенные типы данных. ``short`` и ``long`` задают размер, ``unsigned`` — без знака. * - **Определение типа** - ``typedef unsigned char BYTE;`` - Создаёт псевдоним для существующего типа, повышая читаемость кода. * - **Перечисления** - ``enum Color { RED, GREEN, BLUE };`` - Задаёт набор именованных целочисленных констант. * - **Указатели** - ``int *ptr;``, ``&x``, ``*ptr``, ``ptr++``, ``ptr + 1`` - Хранение адресов, разыменование, арифметика указателей (перемещение на размер типа). * - **`const` с указателями** - ``const int *ptr;``, ``int *const ptr;``, ``const int *const ptr;`` - ``const int *ptr;``: данные неизменяемы. ``int *const ptr;``: указатель неизменяем. ``const int *const ptr;``: и данные, и указатель неизменяемы. * - **Указатели на функции** - ``int (*func_ptr)(int, int);`` - Хранит адрес функции. Полезно для колбэков и динамических вызовов. * - **Универсальные указатели** - ``void *gen_ptr;``, ``malloc(size)`` - ``void*`` может указывать на любые данные; требует приведения при использовании (``(int*)gen_ptr``). * - **Массивы** - ``int arr[10];``, ``arr[0]``, ``int matrix[2][3];`` - Коллекции элементов. Имя массива указывает на первый элемент. Размер фиксирован на этапе компиляции. * - **Разница между массивами и указателями** - ``int arr[5]; int *ptr = arr;`` - Массив — блок памяти; указатель — переменная с адресом. ``sizeof(arr)`` — размер всего массива, ``sizeof(ptr)`` — размер указателя. * - **Динамическая память** - ``malloc(size)``, ``calloc(count, size)``, ``realloc(ptr, new_size)``, ``free(ptr)`` - Выделение/освобождение памяти во время выполнения. ``calloc`` инициализирует нулями. * - **Размер объекта** - ``sizeof(int)``, ``sizeof(my_struct)``, ``sizeof(array_name)`` - Размер в байтах. ``sizeof`` массива корректен только в той области, где он определён (не в параметрах функций). * - **Строки** - ``char str[] = "Hello";``, ``char *s = "World";``, ``const char *msg = "Const";`` - Массивы символов с ``\0``. Строковые литералы лучше объявлять через ``const char*`` (часто read-only). * - **Структуры и объединения** - ``struct Point { int x, y; };``, ``union Data { int i; float f; };`` - ``struct`` — набор разных переменных. ``union`` — все члены занимают одну область памяти. * - **Доступ к членам** - ``my_point.x``, ``ptr->y`` - ``.`` — доступ напрямую, ``->`` — через указатель. * - **Классы хранения** - ``auto``, ``static``, ``extern``, ``register`` - Определяют область видимости, продолжительность жизни и место хранения переменной. * - **Квалификаторы типов** - ``const``, ``volatile``, ``restrict`` - ``const`` — неизменяемость, ``volatile`` — отключение оптимизаций, ``restrict`` — обещание об отсутствии пересечений. * - **Приведение типов** - ``(int)float_val;``, ``(MyStruct*)void_ptr;`` - Явное преобразование типов (casting). * - **Условия** - ``if``, ``else if``, ``else``, ``switch`` - Управление потоком исполнения в зависимости от условий. * - **Тернарный оператор** - ``condition ? expr_true : expr_false;`` - Альтернатива ``if-else`` для выражений. * - **Циклы** - ``for``, ``while``, ``do-while`` - Организация повторения кода. * - **Операторы перехода** - ``break``, ``continue``, ``goto`` - ``break`` — выход из цикла. ``continue`` — пропуск итерации. ``goto`` — переход к метке (использовать с осторожностью). * - **Функции** - ``int sum(int a, int b) { return a + b; }``, ``void hello(void);`` - Блоки с параметрами и возвращаемыми значениями. ``void`` указывает на отсутствие аргументов. * - **Рекурсия** - ``int factorial(int n) { return n==0 ? 1 : n*factorial(n-1); }`` - Функция вызывает саму себя. Требует базового случая. * - **Работа с файлами** - ``FILE *fp;``, ``fopen()``, ``fclose()``, ``fread()``, ``fwrite()``, ``fseek()``, ``rewind()``, ``ftell()``, ``feof()``, ``ferror()`` - Работа с потоками. ``ftell`` возвращает позицию, ``feof`` и ``ferror`` — проверка состояния. * - **Обработка ошибок** - ``errno``, ``perror()``, ``strerror()`` - ``errno`` — глобальная ошибка. ``perror`` — печать сообщения. ``strerror`` — описание по коду. * - **Битовые операции** - ``&``, ``|``, ``^``, ``~``, ``<<``, ``>>`` - Побитовые операции: маски, флаги, оптимизация. * - **Аргументы командной строки** - ``int main(int argc, char *argv[])`` - ``argc`` — число аргументов. ``argv`` — массив строк. * - **Комментарии** - ``// однострочный``, ``/* многострочный */`` - Игнорируются компилятором. Повышают читаемость и документацию. ---- .. note:: Дополнительные практики: - Используйте ``const`` везде, где возможно. - Освобождайте всю динамически выделенную память. - Избегайте ``goto``, если возможно. - Следите за ``buffer overflows`` при работе со строками. Полезные онлайн-инструменты --------------------------- - **C Online Compiler (GCC)** – https://godbolt.org/ Compiler Explorer: сравнение ассемблерного вывода разных компиляторов. - **C Reference** – https://en.cppreference.com/w/c Подробная справка по языку C: синтаксис, стандартные функции, типы, макросы. - **Online C Compiler** – https://www.programiz.com/c-programming/online-compiler Удобный онлайн-компилятор с редактором кода и запуском программ. - **C Tutor (визуализатор исполнения кода)** – https://pythontutor.com/c.html#mode=edit Пошаговая визуализация работы программы: стек вызовов, значения переменных. - **Replit (C Workspace)** – https://replit.com/languages/c Среда разработки на C прямо в браузере с сохранением и шарингом проектов. - **OnlineGDB C Debugger** – https://www.onlinegdb.com/online_c_compiler Онлайн-компилятор с поддержкой пошаговой отладки и точек останова. - **ISO C Standard Draft (PDF)** – https://www.open-std.org/jtc1/sc22/wg14/ Проекты стандартов языка C от комитета WG14 (официальные черновики).