4. Глава 30: Расширенная быстрая справка по языку C

В этой главе представлен расширенный справочный материал по языку C, охватывающий более глубокие концепции, включая работу с памятью, продвинутые операции с указателями, обработку ошибок, макросы и другие важные аспекты, необходимые для разработки на C.

Примечание

Для работы с приведёнными функциями и конструкциями требуются следующие заголовочные файлы:

  • #include <stdio.h> — ввод/вывод, работа с файлами.

  • #include <stdlib.h> — память, преобразования, malloc().

  • #include <string.h> — работа со строками.

  • #include <errno.h> — обработка ошибок.

4.1. Расширенный Cheat Sheet: Язык C

Концепция

Ключевые слова / Пример

Описание

Объявление переменных

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 — массив строк.

Комментарии

// однострочный, /* многострочный */

Игнорируются компилятором. Повышают читаемость и документацию.


Примечание

Дополнительные практики: - Используйте const везде, где возможно. - Освобождайте всю динамически выделенную память. - Избегайте goto, если возможно. - Следите за buffer overflows при работе со строками.

4.2. Полезные онлайн-инструменты

  • C Online Compiler (GCC)https://godbolt.org/ Compiler Explorer: сравнение ассемблерного вывода разных компиляторов.

  • C Referencehttps://en.cppreference.com/w/c Подробная справка по языку C: синтаксис, стандартные функции, типы, макросы.

  • Online C Compilerhttps://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 Debuggerhttps://www.onlinegdb.com/online_c_compiler Онлайн-компилятор с поддержкой пошаговой отладки и точек останова.

  • ISO C Standard Draft (PDF)https://www.open-std.org/jtc1/sc22/wg14/ Проекты стандартов языка C от комитета WG14 (официальные черновики).