C 標準**未規定**求值順序 (編譯器相關)。
int i = 2; max(i, i++); // 可能 max(2,2) 或 max(3,2) // 結論:避免在參數中使用副作用表達式
跨文件共享變量/函數:extern int g_var; (聲明),定義處不加 extern。
| 聲明 | 含義 |
|---|---|
const int *p / int const *p | 指向常量的指針:*p 不可改,p 可改 |
int *const p | 常量指針:p 不可改,*p 可改 |
const int *const p | 雙重常量:指針與指向值均不可改 |
口訣:const 靠近 * 修飾指針,否則修飾指向值。
int is_little_endian() {
union { int i; char c; } u;
u.i = 0x01;
return u.c == 0x01; // 低地址存低位 → 小端
}
char *a; // a 是指針,類型 char* // 去掉變量名看類型:char* → 指針類型 // 去掉 * 看指向類型:char → 指向 char int *p1[10]; // 指針數組:10 個 int* int (*p2)[10]; // 數組指針:指向 int[10] 的指針 char a[5]; char (*p3)[5] = &a; // 正確:&a 類型 char(*)[5] char (*p4)[5] = a; // 錯誤:a 退化為 char* (首元素地址) char *p5 = a; // 正確:a 退化為 &a[0]
出現警告時,**指針類型應跟隨左操作數** (目標指針類型)。