第34〜42回までの要点を チートシート でおさらいし、コード読み取り6問 と 「よくあるミス」チェックリスト で定着度を確認します。
int x = 5; int *p = &x; // p は x の住所を持つ printf("%d\n", *p); // 5 (中身を取り出す) *p = 100; // x も 100 になる!
* は宣言、*p = 5 の * は参照外しstruct Point { int x, y; }; struct Point p = { 3, 4 }; printf("%d %d\n", p.x, p.y); // 3 4 struct Point *pp = &p; printf("%d\n", pp->x); // 3 (-> は (*pp).x の略)
.、ポインタなら ->#include <stdlib.h> int *a = malloc(sizeof(int) * 10); if (a == NULL) { /* 失敗 */ } a[0] = 42; free(a); // 必ず解放! a = NULL; // 二重解放防止
NULL が返るFILE *fp = fopen("data.txt", "r"); if (fp == NULL) { /* 開けなかった */ } int n; fscanf(fp, "%d", &n); fclose(fp); // 必ず閉じる!
| 記号 | 意味 | 例 |
|---|---|---|
| & | AND | 5 & 3 → 1 |
| | | OR | 5 | 3 → 7 |
| ^ | XOR | 5 ^ 3 → 6 |
| ~ | 反転 | ~5 → -6 |
| << | 左シフト | 1 << 3 → 8 |
| >> | 右シフト | 8 >> 2 → 2 |
n & 1 == 0n << 1 / n >> 1&& とビット & は別物int x = 10; int *p = &x; *p = 99; printf("%d\n", x);
p = &x で p は x の住所を指す。*p = 99 は「p が指す先(= x)に 99 を入れる」。void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; } int x = 3, y = 7; swap(&x, &y); printf("%d %d\n", x, y);
struct Point { int x, y; }; struct Point p = {10, 20}; struct Point *pp = &p; pp->x = 99; printf("%d %d\n", p.x, p.y);
pp->x は (*pp).x の省略形で、p のメンバ x を直接指す。pp->x = 99 で p.x が 99 に なる。-> は構造体ポインタの「中の」メンバを触る記号。
#include <stdlib.h> int *a = malloc(sizeof(int) * 3); a[0] = 10; a[1] = 20; a[2] = 30; int sum = a[0] + a[1] + a[2]; free(a); printf("%d\n", sum);
a[0] を読もうとしたら未定義動作(use-after-free)。
for (int n = 1; n <= 5; n++) { if ((n & 1) == 0) printf("%d ", n); }
n & 1 は最下位ビットを取り出す。偶数なら 0、奇数なら 1。(n & 1) == 0 は 偶数のとき真。n % 2 == 0 と同じ意味だが、ビット演算の方が高速(古典的な手法)。
struct P { int x, y; }; struct P a = {1, 2}; struct P b = a; // コピー b.x = 99; printf("%d %d %d %d\n", a.x, a.y, b.x, b.y);
struct P b = a は構造体ごと 値コピー。a と b は独立した別物。int *p; *p = 5; は p が指す先が不明 → 未定義動作。宣言時に NULL か有効なアドレスで初期化。
free を忘れたfree したポインタを使った(use-after-free)p = NULL にしておくと安全。
if(fp == NULL) で確認。
fclose を忘れた. と -> を取り違えたp.x、ポインタなら pp->x。pp.x はコンパイルエラー。
&& とビット & を混同した(a == 1) & (b == 2) は両辺の真偽をビット AND するので一見動くが、短絡評価が効かず副作用が変わる。条件は &&。