Шпаргалка по C
Последнее обновление
Hello World и структура программы
Любая программа на C начинается с main и возвращает int.
| Элемент | Код |
|---|---|
| Подключить заголовок | #include <stdio.h> |
| Точка входа | int main(void) { ... } |
| С аргументами командной строки | int main(int argc, char *argv[]) { ... } |
| Вывести строку | printf("Hello, World!\n"); |
| Вернуть признак успеха | return 0; |
| Однострочный комментарий | // comment |
| Блочный комментарий | /* comment */ |
Типы данных
Размеры зависят от платформы; приведённые ниже минимумы гарантированы стандартом.
| Тип | Описание |
|---|---|
int | Целое, не менее 16 бит (обычно 32) |
unsigned int | Неотрицательное целое |
long / long long | Более широкие целые (не менее 32 / 64 бит) |
float / double | Плавающая точка одинарной / двойной точности |
char | Один байт, также используется для символов |
_Bool (bool через <stdbool.h>) | true или false |
size_t | Беззнаковый тип для размеров и индексов |
void | Отсутствие типа - для функций и обобщённых указателей |
Спецификаторы формата printf и scanf
Заполнители, которые соответствуют типу каждого аргумента.
| Спецификатор | Чему соответствует |
|---|---|
%d / %i | Знаковый int |
%u | Беззнаковый int |
%ld / %lld | long / long long |
%f | double (и float в printf) |
%.2f | double с 2 знаками после запятой |
%c | Один char |
%s | Строка (char *) |
%p | Адрес указателя |
%x | Беззнаковый int в шестнадцатеричном виде |
%zu | size_t |
Операторы
| Оператор | Значение |
|---|---|
+ - * / % | Арифметика (% - остаток от целочисленного деления) |
== != | Равно / не равно |
< > <= >= | Сравнение |
&& || ! | Логические и / или / не |
& | ^ ~ << >> | Побитовые и, или, исключающее или, не, сдвиги |
++ -- | Инкремент / декремент |
+= -= *= /= | Составное присваивание |
cond ? a : b | Тернарный условный оператор |
sizeof(x) | Размер типа или переменной в байтах |
Управление потоком
| Конструкция | Синтаксис |
|---|---|
| If / else | if (x > 0) { ... } else { ... } |
| Else if | else if (x == 0) { ... } |
| Switch | switch (n) { case 1: ...; break; default: ...; } |
| Цикл while | while (i < n) { ... } |
| Цикл do-while | do { ... } while (i < n); |
| Цикл for | for (int i = 0; i < n; i++) { ... } |
| Break / continue | break; выходит из цикла, continue; переходит к следующей итерации |
| Goto (редко) | goto label; ... label: |
Функции
Объявляйте до использования или добавьте прототип в начало файла.
| Операция | Синтаксис |
|---|---|
| Определить функцию | int add(int a, int b) { return a + b; } |
| Прототип (объявление) | int add(int a, int b); |
| Без возвращаемого значения | void greet(void) { ... } |
| Без параметров | int rand_seed(void) { ... } |
| Передача по указателю (изменение) | void inc(int *p) { (*p)++; } |
| Передать массив | int sum(int arr[], int n) { ... } |
| Static (локальная для файла) | static int helper(void) { ... } |
Указатели и память
Указатель хранит адрес. Память в куче нужно освобождать вручную.
| Операция | Синтаксис |
|---|---|
| Объявить указатель | int *p; |
| Взятие адреса | p = &x; |
| Разыменование (чтение/запись) | int y = *p; / *p = 10; |
| Нулевой указатель | int *p = NULL; |
| Выделить в куче | int *a = malloc(n * sizeof(int)); |
| Выделить + обнулить | int *a = calloc(n, sizeof(int)); |
| Изменить размер выделения | a = realloc(a, newSize); |
| Освободить память в куче | free(a); |
| Арифметика указателей | *(a + i) - то же, что a[i] |
Массивы и строки
Строки в C - это массивы char, завершаемые \0.
| Операция | Синтаксис |
|---|---|
| Объявить массив | int nums[5]; |
| Инициализировать массив | int nums[] = {1, 2, 3}; |
| Доступ к элементу | nums[0] = 10; |
| Длина массива (массивы на стеке) | sizeof(nums) / sizeof(nums[0]) |
| Строковый литерал | char s[] = "hello"; |
| Длина строки | strlen(s) (без учёта \0) |
| Скопировать строку | strcpy(dst, src); |
| Сравнить строки | strcmp(a, b) == 0 означает равенство |
| Объединить строки | strcat(dst, src); |
Структуры и частые функции stdlib
| Операция | Синтаксис |
|---|---|
| Определить структуру | struct Point { int x; int y; }; |
| Объявить и обратиться | struct Point p; p.x = 1; |
| Доступ через указатель | p->x = 1; (то же, что (*p).x) |
| Псевдоним типа | typedef struct Point Point; |
| Считать ввод | scanf("%d", &n); |
| Преобразовать строку в int | int n = atoi("42"); |
| Модуль / степень | abs(x) (int), pow(x, y) из <math.h> |
| Отсортировать массив | qsort(arr, n, sizeof(int), cmp); |
Синтаксис C, спецификаторы формата и паттерны работы с указателями, которые нужны чаще всего, на одной странице. Эта шпаргалка по C - быстрый справочник для написания кода на C: типы данных, спецификаторы printf/scanf, операторы, управление потоком, а также операции с указателями и памятью, на которых многие спотыкаются.
Всё здесь - стандартный C (C99/C11), который компилируется с помощью gcc или clang. Копируйте нужное или попробуйте любой фрагмент вживую в playground для C - без установки компилятора.
Часто задаваемые вопросы по шпаргалке C
Эта шпаргалка по C бесплатна?
В чём разница между стеком и кучей в C?
malloc или calloc, живёт до вызова free и используется, когда нужна память, переживающая текущую функцию, или память, размер которой известен только во время выполнения. Если забыть вызвать free для памяти в куче, возникнет утечка памяти.Почему scanf нужен амперсанд (&), а printf - нет?
scanf записывает значение обратно в вашу переменную, поэтому ему нужен адрес переменной - именно это даёт &x. printf только читает значение, поэтому вы передаёте само значение. Исключение - строки: массив char уже приводится к указателю, поэтому вы передаёте scanf("%s", name) без &.