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

不再害怕指針(一):指針四大核心屬性深度解析

     編輯:關於C語言

前言

指針是 C/C++ 靈活與危險並存的利器。搞懂指針,必須從四個維度建立清晰心智模型:**指針類型、指向類型、指針值(地址)、指針自身佔用的記憶體**。本文逐一拆解。

聲明範例

(1) int  *ptr;
(2) char *ptr;
(3) int **ptr;
(4) int (*ptr)[3];
(5) int *(*ptr)[4];

1. 指針類型 —— 指針「本身」的類型

口訣: 去掉聲明中的指針變量名,剩下的就是指針類型。

聲明指針類型
int *ptr;int *
char *ptr;char *
int **ptr;int **
int (*ptr)[3];int (*)[3]
int *(*ptr)[4];int *(*)[4]

指針類型決定了:sizeof(ptr)、指針能參與的運算、作為參數傳遞時的匹配規則。

2. 指向類型 —— 解引用後得到的類型

口訣: 去掉變量名及其左邊的 *,剩下的就是指向類型。

聲明指向類型
int *ptr;int
char *ptr;char
int **ptr;int *
int (*ptr)[3];int [3] (長度為 3 的 int 數組)
int *(*ptr)[4];int *[4] (長度為 4 的 int* 數組)

關鍵作用:

  • 指針算術步長 = sizeof(指向類型)。
  • 解引用 *ptr 的結果類型、佔用字節數。
  • 隱式轉換規則 (如 void* 可隱式轉任何指向類型)。

3. 指針值 (地址) —— 指針存儲的數值

  • 32 位程序:所有指針值均為 32 位無符號整數 (4 字節)。
  • 64 位程序:均為 64 位 (8 字節)。
  • 指針值 = 所指內存區的**起始地址**。
  • 所指內存區大小 = sizeof(指向類型)。
  • 未初始化指針的值是**不確定的**(垃圾值),解引用導致 UB。

4. 指針自身佔用的記憶體

  • sizeof(指針類型) 即為指針變量本身佔用的棧/數據區空間。
  • 32 位下通常為 4 字節,64 位下為 8 字節,**與指向類型無關**。
  • 判斷指針表達式是否為**左值**的依據:只有佔用記憶體的對象才能取地址、賦值。

實戰檢查清單

每遇到一個指針,問自己三個問題:

  1. 這個指針的**類型**是什麼? (決定 sizeof、參數匹配)
  2. 它**指向的類型**是什麼? (決定步長、解引用結果)
  3. 它**當前指向哪裡**? (是否有效、是否已初始化、是否越界)

進階對比:指針類型 vs 指向類型

int *p;        // 類型 int*,指向 int
int **pp;      // 類型 int**,指向 int*
int (*pa)[3];  // 類型 int(*)[3],指向 int[3]
int *pa2[3];   // 類型 int*[3] (數組),指向 int* (數組元素)

區分二者是精通指針的**分水嶺**,請反覆研讀聲明語法直到肌肉記憶形成。

總結

指針四屬性緊扣:

  • 類型 — 編譯期靜態屬性,決策語法合法性。
  • 指向類型 — 語義屬性,決策運行期行為 (步長、解引用)。
  • 值 — 運行期動態屬性,決策訪問哪塊內存。
  • 自身記憶體 — 物理屬性,決策存儲開銷與左值屬性。

下一篇將深入講解指針算術運算的奇妙世界。

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