if-else, switch, while, do-while, for。| 類別 | 關鍵字 | 典型大小 | 備註 |
|---|---|---|---|
| 整數 | int short long long long | 2/4/8 位元組 | unsigned 修飾無號 |
| 實數 | float double long double | 4/8/16 位元組 | IEEE 754 |
| 字元 | char | 1 位元組 | 可當小整數用 |
| 列舉 | enum | - | 命名常數群 |
| 空型別 | void | - | 無回傳/泛型指標 |
0123;十六進位:0x1F;字元:'a'、'\n'、'\x1B'。"abc" 結尾隱含 \0,存於唯讀區;'a' 為單字元整數。char, short → int → unsigned → long → long long
→ float → double → long double
() [] -> . (後置/結構成員)++ -- + - ! ~ (type) * & sizeof (一元)* / %+ -<< >>< <= > >=== !=& (位元 AND)^ (位元 XOR)| (位元 OR)&& (邏輯 AND)|| (邏輯 OR)?: (條件)= += -= *= /= %= &= ^= |= <<= >>= (指派), (逗號)if-else, switch-case, ?:while, do-while, forbreak:跳出最內層 switch/迴圈。continue:結束本次迴圈迭代,進入下一次判斷。goto:非結構化跳轉,慎用。return:離開函式並回傳值。stdio.h)printf 格式字元| 字元 | 說明 | 常用旗標 |
|---|---|---|
%d %ld %lld | 有號十進位 | %05d 零填寬、%-5d 左靠 |
%u %lu | 無號十進位 | |
%o %x %X | 八/十六進位 | %#x 加 0x |
%c | 單一字元 | |
%s | 字串 | %.10s 限寬、%-10s 左靠 |
%f %lf | 定點實數 | %8.3f 共 8 寬、3 位小數 |
%e %E %g %G | 科學/自動記號 | |
%p | 指標位址 |
scanf 注意事項&var (陣列名/字串名本身即位址)。%*d 跳過讀取。%5.2f 非法)。int a[10] = {0}; // 靜態,未初始化為 0
int *p = malloc(n*sizeof(int)); // 動態,需 free
Row-major:a[i][j] 位址 = base + (i*COLS + j)*sizeof(int)。
函式參數:void f(int a[][COLS]) 或 void f(int (*a)[COLS]),第二維必須給定。
string.h)strlen、strcpy、strncpy、strcat、strncatstrcmp、strncmp、strchr、strstrstrtok (破壞原字串、非執行緒安全,建議用 strtok_r)警告: strcat(dest, src) 需確保 dest 空間足夠,否則緩衝區溢位。
形式參數為區域變數,實參值複製給形參。若需修改實參,傳遞指標:void swap(int *a, int *b)。
函式直接/間接呼叫自身。需有基礎案例終止。例:階乘、費波那契、河內塔。
| 關鍵字 | 儲存期 | 作用域 | 連結性 | 預設值 |
|---|---|---|---|---|
auto (省略) | 區塊 | 區塊 | 無 | 不定 |
register | 區塊 | 區塊 | 無 | 不定 |
static (區塊內) | 程式 | 區塊 | 無 | 0 |
extern | 程式 | 檔案/全域 | 外部 | 0 |
static (檔案層級) | 程式 | 檔案 | 內部 | 0 |
函式預設為 extern;static 函式僅本檔可見。
#define PI 3.14159
#define SQR(x) ((x)*(x)) // 括號防優先序錯誤
#define MAX(a,b) ((a)>(b)?(a):(b))
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
#include <sys.h>:系統標準路徑搜尋。#include "my.h":先當前目錄,再標準路徑。#ifdef DEBUG
#define LOG(...) DEBUG_PRINT(__VA_ARGS__)
#else
#define LOG(...)
#endif
#ifndef GUARD_H
#define GUARD_H
// 頭檔內容
#endif
int *p; // 指向 int 的指標
int **pp; // 指向指標的指標
int (*pa)[10]; // 指向 10 元素 int 陣列的指標
int *pa[10]; // 10 個指向 int 的指標陣列 (陣列指標)
p + n:位址增加 n * sizeof(*p)。p - q:同陣列兩指標相減得元素個數差 (ptrdiff_t)。*p、p[i] 等價 *(p+i)。int *),但 sizeof(arr) 為整個陣列大小,&arr 型別為 int (*)[N]。const char *,存唯讀區,不可修改。int (*cmp)(const void*, const void*),用於 qsort、回呼機制。stdlib.h)void *malloc(size_t size); // 未初始化
void *calloc(size_t n, size_t size); // 零初始化
void *realloc(void *ptr, size_t size); // 調整大小
void free(void *ptr); // 釋放,ptr 需為 malloc 系回傳或 NULL
鐵律: 每個 malloc/calloc/realloc 必配對 free,釋放後指標置 NULL 避免野指標。
struct Node {
int data;
struct Node *next;
};
union Data { int i; float f; char c; }; // 共用記憶體,大小取最大成員
struct Flags { unsigned int a:1; unsigned int b:3; unsigned int :0; }; // 位元欄,:0 強制對齊
FILE *fp = fopen("data.bin", "wb"); // 二進位寫入
fwrite(buf, sizeof(Record), count, fp);
fclose(fp);
fp = fopen("data.bin", "rb");
fseek(fp, offset, SEEK_SET);
fread(&rec, sizeof(Record), 1, fp);
錯誤處理:檢查回傳值,ferror(fp), feof(fp), perror()。
本筆記涵蓋 C 語言核心知識體系,建議配合《C Primer Plus》、《C 程式設計語言 (K&R)》、《C 專家程式設計》深入研讀,並大量實作專案 (如解譯器、資料庫、網路伺服器、嵌入式韌體) 內化為技能。