Menu
Coddy logo textTech

Шпаргалка по 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 / %lldlong / long long
%fdoublefloat в printf)
%.2fdouble с 2 знаками после запятой
%cОдин char
%sСтрока (char *)
%pАдрес указателя
%xБеззнаковый int в шестнадцатеричном виде
%zusize_t

Операторы

ОператорЗначение
+ - * / %Арифметика (% - остаток от целочисленного деления)
== !=Равно / не равно
< > <= >=Сравнение
&& || !Логические и / или / не
& | ^ ~ << >>Побитовые и, или, исключающее или, не, сдвиги
++ --Инкремент / декремент
+= -= *= /=Составное присваивание
cond ? a : bТернарный условный оператор
sizeof(x)Размер типа или переменной в байтах

Управление потоком

КонструкцияСинтаксис
If / elseif (x > 0) { ... } else { ... }
Else ifelse if (x == 0) { ... }
Switchswitch (n) { case 1: ...; break; default: ...; }
Цикл whilewhile (i < n) { ... }
Цикл do-whiledo { ... } while (i < n);
Цикл forfor (int i = 0; i < n; i++) { ... }
Break / continuebreak; выходит из цикла, 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);
Преобразовать строку в intint 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 полностью бесплатна, регистрация не требуется. Добавьте её в закладки и возвращайтесь, когда нужно посмотреть тип, спецификатор формата или операцию с указателем.
В чём разница между стеком и кучей в C?
Память стека хранит локальные переменные и освобождается автоматически при возврате из функции - быстро, но ограничена по размеру. Память кучи выделяется явно с помощью malloc или calloc, живёт до вызова free и используется, когда нужна память, переживающая текущую функцию, или память, размер которой известен только во время выполнения. Если забыть вызвать free для памяти в куче, возникнет утечка памяти.
Почему scanf нужен амперсанд (&), а printf - нет?
scanf записывает значение обратно в вашу переменную, поэтому ему нужен адрес переменной - именно это даёт &x. printf только читает значение, поэтому вы передаёте само значение. Исключение - строки: массив char уже приводится к указателю, поэтому вы передаёте scanf("%s", name) без &.
Можно ли практиковать C онлайн?
Да. Откройте playground для C, чтобы скомпилировать и запустить любой фрагмент из этой шпаргалки прямо в браузере - без установки компилятора. А если нужна структура, бесплатный интерактивный курс C от Coddy шаг за шагом проведёт вас от переменных и циклов до указателей и управления памятью.
Подходит ли эта шпаргалка для начинающих?
Да. Она построена от самых распространённых строительных блоков (типы, printf, управление потоком) к продвинутым (указатели, память, структуры), так что верхние разделы можно использовать с первого дня и постепенно осваивать остальное.
Coddy programming languages illustration

Изучайте C с Coddy

НАЧАТЬ