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

C 指針學習總結:從記憶體模型到多級多維指針的完整知識圖譜

     編輯:關於C語言

C 指針學習總結:從記憶體模型到多級多維指針的完整知識圖譜

指針是 C 語言的靈魂。本文系統整理指針核心概念、記憶體模型、類型語意、多維/多級指針操作規則與實戰陷阱,構建完整知識體系。

一、核心認知:地址、類型與解引用

  1. 變數/陣列首地址:存放資料的 RAM/ROM 中地址最小的位元組地址。
  2. 指針類型雙重語意:
    • 算術運算步長:ptr + n 跳過 n * sizeof(type) 位元組
    • 解引用寬度:*ptr 讀取 sizeof(type) 位元組
  3. 大小端序:低地址存高位元組(大端,常見單晶片)vs 低地址存低位元組(小端,ARM/x86)。

二、關鍵符號與賦值規則

符號名稱語意
&取址運算子取得變數/陣列元素首地址
*解引用運算子透過地址存取資料
arr陣列名相當於 &arr[0],無需 &
&var取變數地址指針賦值右值必須是地址

三、指針分類體系

  • 按指向對象:變數指針、陣列指針(多維)、函數指針、結構體指針
  • 按層級:一級指針、多級指針(**p)
  • 按維度:一維指針、多維指針(int (*p)[3])
  • 地址同理:多級地址、多維地址

四、字串與指針特殊規則

  • 字元陣列以 \0 結尾,隱含一個值為 0 的結束元素
  • char *p = "hello"; 指向唯讀字面量區,不可修改內容

五、多維指針操作核心原則

char (*p)[2];  // 二維指針:指向含 2 個 char 的陣列

// 解析步驟:
// 1. 確認指針維數:p 是一級二維指針
// 2. 方括號操作:p[i] 跳過 i * 2 * sizeof(char) 位元組
// 3. 解引用次數:*(p[i]) 為一維指針,**(p[i]) 為 char 值

六、多級指針實戰演示

int val = 0x1122;
char *p3 = (char*)&val;   // 一級指針,操作 1 位元組
char **p2 = &p3;          // 二級指針,操作 4/8 位元組(地址長度)

// p3+1  跳過 1 位元組
// p2+1  跳過 1 個指針大小(4/8 位元組)
// *p2   取得 p3 的值(地址)
// **p2  取得 val 低位元組

七、動態記憶體與非法存取示範

int *p = malloc(2);  // 僅分配 2 位元組
*p = 0x12345678;     // 非法寫入 4 位元組 → 越界破壞鄰近記憶體
free(p);
*p = 0x87654321;     // 迷途指針:使用已釋放記憶體 → 未定義行為

八、函數指針聲明與調用

unsigned char (*q)();  // 返回 unsigned char、無參函數指針
(*q)();  // 或 q() 調用
// 未傳參時預設傳遞 -1(舊式 K&R 風格,現代 C 應避免)

九、多級多維指針綜合範例

unsigned char (**p)[3];  // 二級二維指針
int Array3[10] = { ... };
p = (unsigned char(**)[3])Array3;  // 強制轉型(教學示範,實務需謹慎)

// p       → 二級二維地址
// p+1     → 跳過 1 個指針大小
// *p      → 一級二維指針
// *p+1    → 跳過 3 位元組(維度生效)
// **p     → 一級一維指針
// ***p    → 1 位元組值

// 解引用遞減規則:先降級(多級→一級),再降維(多維→一維→值)

十、最佳實踐清單

  1. 指針宣告緊貼類型:int *p; 而非 int* p;(避免多變數宣告誤解)
  2. 一律初始化為 NULL
  3. 解引用前檢查非空
  4. malloc 大小與指針類型匹配
  5. 釋放後置空
  6. 函數參數傳陣列必帶長度
  7. 避免指針算術操作結構體字段
  8. 善用 typedef 簡化複雜指針類型聲明

指針精通之路:理解記憶體模型 → 掌握類型語意 → 熟練多維/多級操作 → 培養防禦性習慣。反覆實作、畫圖驗證,方能化險夷為夷途。

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