簡單來說,指標就像是一棟大樓的門牌號碼,而物件則是這棟大樓本身。指標變數本身佔用一個固定大小的記憶體單元(通常 4 或 8 位元組),專門用來儲存「地址」;而物件才是實際佔據記憶體空間、存放資料的實體。
程式開頭的變數宣告,本質上是向作業系統申請記憶體。指標宣告(如 char *buff;)僅分配一個「存門牌」的單元;若要真正使用,必須為其指向的物件分配空間——否則你手裡只有門牌,沒有大樓。
char *buff; // buff 是存放門牌號的單元
buff = (char *)malloc(32 * sizeof(char));
// 為「掛著 buff 門牌」的大樓,蓋 32 個房間,每間大小 1 byte
malloc 從堆區劃分 32 個連續位元組,並將首地址賦給 buff。此時 buff[0] ~ buff[31] 皆可安全讀寫。
float *p; // 存門牌的單元
float a[100]; // 真正的「浮點數大樓」
a[9] = 9.0;
p = &a[0]; // 取大樓首間房間的門牌號,存入 p
printf("%f\n", p[9]); // 透過 p 訪問第 10 間房
此處 &a[0] 計算陣列首元素地址,賦予指標 p。之後 p[i] 等價於 a[i],但 p 本身可重新指向其他記憶體,而陣列名 a 則是常量指標,不可修改。
free;陣列物件隨作用域自動釋放。p[i] 編譯器自動轉為 *(p+i),掩蓋了指標運算細節。malloc 失敗返回 NULL 未檢查 → 後續寫入導致崩潰。sizeof(ptr) 回傳指標大小,而非陣列長度。理解「指標是門牌,物件是大樓」,能幫助你在記憶體管理、函式參數傳遞、資料結構設計等場景做出正確抉擇。