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

C/C++ 指標精髓(三):指標運算完整解析

     編輯:關於C++

指標運算是 C/C++ 靈活操作記憶體的核心,亦是缺陷高發區。本文系統梳理指標的賦值、加減、關係、取址/取值運算,並以 32 位元環境為基準說明位元組位移規則,助你建立精確的心智模型。

1.4 指標運算分類

1.4.1 賦值運算(六種形式)

形式範例說明
初始化int a; int *ip = &a;宣告時指定地址
變數地址賦值int a; int *ip; ip = &a;同型別變數地址
指標間賦值int *pa = &a; int *pb; pb = pa;同型別指標互賦
陣列首址賦值int a[5], *pa; pa = a; // 或 pa = &a[0]陣列名退化為首元素地址
字串常值賦值char *pc = "c language";指向唯讀字串字面值區
函式入口賦值int (*pf)(); pf = func;函式指標指向程式碼區

1.4.2 加減運算(陣列指標專用)

設 ip 指向型別 T 的陣列元素:

  • ip + n / ip - n:向前/後移動 n × sizeof(T) 位元組。
  • ip++ / ++ip / ip-- / --ip:移動一個元素距離(sizeof(T) 位元組)。

32 位元範例

char a[20];
int *ip = (int*)a;   // 指向 a[0..3] 四個位元組
ip++;                // ip += sizeof(int) = 4,指向 a[4..7]
ip += 5;             // ip += 5 * 4 = 20,指向 a[20..23](已超出陣列)

關鍵規則:指標運算以「元素個數」為單位,編譯器自動乘上 sizeof(指向型別) 換算位元組位移。

1.4.3 關係運算

  • 同一陣列內的指標可比較 == != < > <= >=,比較的是記憶體位址高低。
  • 指標可與 0(或 NULL)比較:ip == 0 表示空指標,ip != 0 表示有效指標。
  • 未初始化指標 ≠ 空指標:未初始化指標值隨機,使用極危險;空指標明確為 0,可安全判斷。

1.4.4 取址 & 與取值 * 運算子

運算子功能結合性範例結果
&取變數位址右向左&a 型別 int*,指向 int
*取指標指向內容右向左*p 型別 int,佔用 p 指向位址

多層指標範例

int a = 12, b;
int *p = &a;      // p: int*, 指向 a
int **ptr = &p;   // ptr: int**, 指向 p
*p = 24;          // 修改 a = 24
*ptr = &b;        // 修改 p 指向 b
**ptr = 34;       // 修改 b = 34

區別:宣告中的 * 是型別修飾符;表達式中的 * 是解參考運算子。

1.4.5 括號結合規則(讀懂複雜宣告)

  1. 優先級:[]、() > *(左結合)。
  2. 遇圓括號優先處理括號內內容。
  3. 口訣:「從變數名向外,先右後左,遇括號進括號」。

經典範例

int (*p)[5];      // p 是指向 int[5] 的指標
int *p[5];        // p 是 int* 陣列(5 個 int 指標)
int (*func)();    // func 是指向函式的指標
int *func();      // func 是回傳 int* 的函式

1.5 指標表達式

最終結果為指標的表達式即指標表達式,具備四要素:指標型別、指向型別、指向記憶體區、指標自身記憶體。所有指標運算均在這四要素框架內進行。


系列導航:(一) 指標概念與四要素 | (二) 記憶體管理與野指標防禦 | (三) 指標運算 | (四) 進階應用與陷阱

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