C 言語 チートシート
最終更新
Hello World とプログラムの構造
すべての C プログラムは main から始まり、int を返します。
| 要素 | コード |
|---|---|
| ヘッダーをインクルード | #include <stdio.h> |
| エントリポイント | int main(void) { ... } |
| コマンドライン引数あり | int main(int argc, char *argv[]) { ... } |
| 1 行を出力 | printf("Hello, World!\n"); |
| 成功を返す | return 0; |
| 一行コメント | // comment |
| ブロックコメント | /* comment */ |
データ型
サイズはプラットフォーム依存です。下記の最小値は標準で保証されています。
| 型 | 説明 |
|---|---|
int | 整数、最低 16 ビット (通常 32) |
unsigned int | 非負の整数 |
long / long long | より幅の広い整数 (最低 32 / 64 ビット) |
float / double | 単精度 / 倍精度の浮動小数点数 |
char | 1 バイト、文字にも使う |
_Bool (<stdbool.h> 経由で bool) | true または false |
size_t | サイズやインデックス用の符号なし型 |
void | 型なし。関数や汎用ポインタに使う |
printf と scanf の書式指定子
各引数の型に対応するプレースホルダ。
| 指定子 | 対応するもの |
|---|---|
%d / %i | 符号付き int |
%u | 符号なし int |
%ld / %lld | long / long long |
%f | double (printf では float も) |
%.2f | 小数点以下 2 桁の double |
%c | 1 文字の char |
%s | 文字列 (char *) |
%p | ポインタのアドレス |
%x | 符号なし int を 16 進数で |
%zu | size_t |
演算子
| 演算子 | 意味 |
|---|---|
+ - * / % | 算術 (% は整数の剰余) |
== != | 等しい / 等しくない |
< > <= >= | 比較 |
&& || ! | 論理 and / or / not |
& | ^ ~ << >> | ビットごとの and、or、xor、not、シフト |
++ -- | インクリメント / デクリメント |
+= -= *= /= | 複合代入 |
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; |
| NULL ポインタ | 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 の文字列は \0 で終端された char の配列です。
| 操作 | 構文 |
|---|---|
| 配列を宣言 | 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); |
構造体とよく使う標準ライブラリ
| 操作 | 構文 |
|---|---|
| 構造体を定義 | 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)、<math.h> の pow(x, y) |
| 配列をソート | qsort(arr, n, sizeof(int), cmp); |
最もよく使う C の構文、書式指定子、ポインタのパターンを 1 ページにまとめました。この C 言語チートシートは、C を書くためのクイックリファレンスです。データ型、printf/scanf の指定子、演算子、制御フロー、そして人がつまずきがちなポインタとメモリの操作を収録しています。
ここに載っているものはすべて標準の C (C99/C11) で、gcc または clang でコンパイルできます。必要なものをコピーするか、C プレイグラウンドでどのスニペットもその場で試してみてください。コンパイラのインストールは不要です。
C 言語 チートシート よくある質問
この C 言語チートシートは無料ですか?
はい。この C 言語チートシートは完全に無料で、登録も不要です。ブックマークしておけば、型や書式指定子、ポインタ操作を調べたいときにいつでも戻ってこられます。
C のスタックとヒープの違いは何ですか?
スタックメモリはローカル変数を保持し、関数が戻ると自動で解放されます。高速ですが、サイズに限りがあります。ヒープメモリは
malloc や calloc で明示的に確保され、free を呼ぶまで存続し、現在の関数より長く生きるメモリや、実行時にしかサイズが分からないメモリが必要なときに使います。ヒープメモリの free を忘れるとメモリリークになります。なぜ scanf にはアンパサンド (&) が必要で printf には不要なのですか?
scanf は値を変数に書き戻すので、変数のアドレスが必要で、それを与えるのが &x です。printf は値を読むだけなので、値そのものを渡します。例外は文字列です。char の配列はすでにポインタに減衰するので、& なしで scanf("%s", name) と渡します。C をオンラインで練習できますか?
はい。C プレイグラウンドを開けば、このチートシートのどのスニペットも、ブラウザ上でコンパイルして実行できます。コンパイラのインストールは不要です。体系的に学びたいときは、Coddy の無料インタラクティブ C コースが、変数とループからポインタ、メモリ管理まで段階的に導いてくれます。
このチートシートは初心者に向いていますか?
はい。最もよく使う構成要素 (型、printf、制御フロー) から高度なもの (ポインタ、メモリ、構造体) へと並べてあるので、初日から上のセクションを使い、残りには慣れながら進めます。