首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C/C++ 指標與物件的本質區別深度解析

     編輯:關於C語言

核心概念:門牌號與大樓的比喻

簡單來說,指標就像是一棟大樓的門牌號碼,而物件則是這棟大樓本身。指標變數本身佔用一個固定大小的記憶體單元(通常 4 或 8 位元組),專門用來儲存「地址」;而物件才是實際佔據記憶體空間、存放資料的實體。

宣告與記憶體分配

程式開頭的變數宣告,本質上是向作業系統申請記憶體。指標宣告(如 char *buff;)僅分配一個「存門牌」的單元;若要真正使用,必須為其指向的物件分配空間——否則你手裡只有門牌,沒有大樓。

動態分配:malloc 範例

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),掩蓋了指標運算細節。

常見陷阱提醒

  1. 未初始化指標直接解參考 → 未定義行為(段錯誤)。
  2. malloc 失敗返回 NULL 未檢查 → 後續寫入導致崩潰。
  3. 釋放後仍使用指標(懸空指標) → 難以排查的隨機錯誤。
  4. 指標與陣列混淆:sizeof(ptr) 回傳指標大小,而非陣列長度。

理解「指標是門牌,物件是大樓」,能幫助你在記憶體管理、函式參數傳遞、資料結構設計等場景做出正確抉擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved