一、有號整數的三碼表示(僅針對負數)
- 原碼:符號位 + 絕對值二進制
- 反碼:符號位不變,其餘位取反
- 補碼:反碼 + 1 —— 計算機實際儲存與運算使用補碼
正數三碼相同。補碼設計使減法變加法,統一運算邏輯。
二、基本資料類型大小對照(32 位系統)
| 類型 | C (bytes) | Java (bytes) |
| char | 1 | 2 (Unicode) |
| short | 2 | 2 |
| int | 4 | 4 |
| long | 4 | 8 |
| long long | 8 | - |
| float | 4 | 4 |
| double | 8 | 8 |
C 語言可用 sizeof(type) 編譯期獲取大小。
三、有號 vs 無號
signed int(預設):最高位為符號位,範圍 -2^31 ~ 2^31-1
unsigned int:全 32 位表數值,範圍 0 ~ 2^32-1
四、字串本質
C 無字串類型,以 char[] 並以 \0 結尾表示。char c[] = "hello"; 實際佔 6 字節。
五、常用格式化輸入輸出佔位符
%d int %ld long %lld long long
%hd short %c char %f float
%lf double %u unsigned %x hex
%o octal %s string %p pointer
六、指標核心觀念
1. 記憶體地址與指標變數
- 每個位元組有唯一地址(門牌號),32 位系統地址總線 32 位 → 最大定址 4 GB。
- 指標變數專門儲存地址,型態決定指向資料的解讀方式。
2. 一級/二級指標
int i = 3, *p = &i; // p 存 i 的地址
int **q = &p; // q 存 p 的地址
3. 野指標
未初始化指標指向隨機地址,使用前必須賦值。
七、參數傳遞:值傳遞 vs 參考傳遞(模擬)
C 只有值傳遞。若需在函數內修改外部變數,傳遞其地址(指標)。
void swap(int *a, int *b) { int t=*a; *a=*b; *b=t; }
swap(&x, &y); // 實際修改 x、y
八、函數回傳多值技巧
透過指標參數帶出多個結果:
void calc(int *sum, int *diff) { *sum = a+b; *diff = a-b; }
九、指標運算與陣列
p+1 移動 sizeof(*p) 位元組。
- 陣列名 = 首元素地址,
a[i] 等價 *(a+i)。
int *p = a; p[2] = *(p+2) = a[2]。
十、指標長度
- 32 位 OS:4 bytes
- 64 位 OS:8 bytes
- 與指向類型無關
十一、堆疊 vs 堆
| 特性 | 堆疊 | 堆 |
| 分配方式 | 編譯器自動 | 程式手動 malloc/free |
| 釋放方式 | 自動 | 手動 free,否則洩漏 |
| 大小限制 | ~2MB (Windows) | 受限於虛擬記憶體 |
| 速度 | 極快 | 較慢,易產生碎片 |
| 儲存內容 | 區域變數、參數、返回地址 | 動態分配物件 |
十二、動態記憶體 API
void *malloc(size_t size);
void *calloc(size_t n, size_t size); // 歸零
void *realloc(void *ptr, size_t new_size); // 調整大小
void free(void *ptr);
realloc 範例:擴充學號陣列
int *p = malloc(count * sizeof(int));
p = realloc(p, (count + add) * sizeof(int));
十三、結構體
struct Student { int age; float score; char sex; };
struct Student s1 = {20, 90.5, 'F'};
s1.age = 21; // 成員存取
struct Student *ps = &s1;
ps->score = 95.0; // 指標存取
- 不可包含函數,可含函數指標實現多態雛形。
- 對齊規則導致
sizeof 非單純成員大小之和。
十四、聯合體
成員共用同一記憶體區塊,大小 = 最大成員大小。同一時間只保留一個成員值。
union Data { int i; char c; } u;
u.i = 0x30313233; // u.c 變為 '0' (低位元組)
十五、列舉與 typedef
enum Week { Mon, Tue, Wed, Thu, Fri, Sat, Sun };
enum Week today = Sun; // 值為 6
typedef int MyInt;
typedef struct { char *name; int id; } Employee;
Employee e = {"Alice", 101};
- 上一篇文章: C 語言檔案操作完整指南:開關、讀寫、二進制與加密實戰
- 下一篇文章: C 語言指標完全掌握:從概念到進階組合宣告解讀
Copyright ©
程式碼之家 All Rights Reserved