sizeof 運算子
- 編譯期計算型別或運算式佔用的位元組數(
size_t)。
sizeof(int)、sizeof 變數、sizeof (型別)。
- 不計算動態分配大小:
sizeof(p) 只會給指標大小(4/8 位元組)。
記憶體位址基本觀念
- 位址以位元組為單位編址,每個位元組唯一編號。
- 變數位址 = 其儲存空間第一個位元組的位址。
&a 取得變數 a 位址,型別為 類型 *。
一維陣列位址關係
int a[5];
printf("%p %p %p\n", (void*)a, (void*)&a[0], (void*)&a); // 全部相同
// a : 陣列首元素位址(型別 int*)
// &a : 整個陣列位址(型別 int(*)[5])
// a+1 : 位址 + sizeof(int)
// &a+1 : 位址 + sizeof(int[5])
二維陣列記憶體佈局(列優先 Row-Major)
int a[2][3] = {{1,2,3},{4,5,6}};
// 記憶體連續:1 2 3 4 5 6
// a == &a[0] == &a[0][0]
// a[0] == &a[0][0] (型別 int*)
// a[1] == &a[1][0] (型別 int*)
// &a == &a[0] (型別 int(*)[3])
關鍵等式:a == a[0] == &a[0][0](數值相同,型別不同)。
二維陣列初始化規則
| 寫法 | 結果 |
int a[2][3] = {{1,2},{3}}; | 剩餘補 0 → {{1,2,0},{3,0,0}} |
int a[][3] = {1,2,3,4,5,6}; | 自動推導行數 = 2,**列數不可省略** |
int a[2][] = {...}; | ❌ 錯誤:編譯器無法計算列跨度 |
sizeof 對陣列與指標的差異
int a[2][3];
sizeof(a) // 24 (2*3*4)
sizeof(a[0]) // 12 (3*4)
sizeof(a[0][0]) // 4
int *p = a[0];
sizeof(p) // 4/8 (指標大小),非陣列大小
函數參數傳遞:陣列退化為指標
void f(int a[][3]); // 必須指定列數
void f(int (*a)[3]); // 等價寫法
// 呼叫:f(arr); // arr 為 int[2][3],退化為 int(*)[3]
常見錯誤與修正
| 錯誤 | 說明 | 修正 |
int a[10]; for(i=1;i<=10;i++) a[i]=0; | 下標越界(0~9) | for(i=0;i<10;i++) |
int a[2][3]; a[1,2] = 5; | 逗號運算子,等同 a[2] 越界 | a[1][2] = 5; |
printf("%s", a); // a 為 int 陣列 | 型別不匹配,亂碼/崩潰 | 逐元素列印或用 %d |
int *p = a; p++; 於 int a[2][3] | p 型別不匹配 | int (*p)[3] = a; |
- 上一篇文章: C 語言基礎語法精要:語句、運算符與型別系統速查手冊
- 下一篇文章: 手寫 C 庫函式:strcmp 與 strcpy 實現細節與邊界處理
Copyright ©
程式碼之家 All Rights Reserved