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

C 語言二級指標深度解析:*(*ptr)++ 與 *ptr++ 差異實測

     編輯:關於C語言

前言

二級指標 (`char **`) 常用於字串陣列、動態二維陣列、函數修改指標本身。本文透過實測程式碼,釐清 `(*ptr)++` 與 `*ptr++` 的運算順序與效果差異。

實測程式碼

#include 

int main() {
    char str1[] = "ABCD";
    char str2[] = "EFGH";
    char *pStrArray[2] = { str1, str2 };  /* 指標陣列 */
    char **pStr1 = pStrArray;
    char **pStr2 = pStrArray;

    (*pStr1)++;   /* 先解參考,再遞增指向的指標 */
    *pStr2++;     /* 先遞增 pStr2 本身,後解參考(未使用) */

    printf("%c ", **pStr1);  /* 輸出 B */
    printf("%c ", **pStr2);  /* 輸出 E */
    getchar();
    return 0;
}

記憶體模型圖解

pStrArray (char *[2])
  ├─ [0] ──→ str1[0]='A', str1[1]='B', ...
  └─ [1] ──→ str2[0]='E', str2[1]='F', ...

pStr1 → pStrArray[0] (位址)
pStr2 → pStrArray[0] (位址)

步驟解析

  1. (*pStr1)++
    • `*pStr1` 取得 `pStrArray[0]` (型別 `char *`,值為 `str1` 位址)。
    • `++` 作用於此 `char *`,使 `pStrArray[0]` 指向 `str1[1]` ('B')。
    • `pStr1` 本身未變,仍指向 `pStrArray[0]`。
    • `**pStr1` → `*pStrArray[0]` → `str1[1]` = 'B'。
  2. *pStr2++
    • 後綴 `++` 優先級高於 `*`,等價 `*(pStr2++)`。
    • `pStr2` 先遞增指向 `pStrArray[1]`,運算式值為舊 `pStr2` (指向 `pStrArray[0]`)。
    • `*` 解參考舊值 → `pStrArray[0]` (未使用)。
    • 陳述式結束,`pStr2` 現指向 `pStrArray[1]`。
    • `**pStr2` → `*pStrArray[1]` → `str2[0]` = 'E'。

常見誤區

誤以為 `(*pStr1)++` 只改區域暫存值。實則 `*pStr1` 是 `pStrArray[0]` 的左值,遞增直接修改陣列元素內容。

優先級速查表

*ptr++(*ptr)++*++ptr++*ptr
運算式結合方向效果
右→左先 `ptr++` (移動 ptr),再 `*` 解參考舊位址
右→左先 `*ptr` 解參考,再 `++` 修改所指物件
右→左先 `++ptr` (移動 ptr),再 `*` 解參考新位址
右→左先 `*ptr` 解參考,再 `++` 修改所指物件 (同 `(*ptr)++` 但前綴)

總結

二級指標操作核心在於區分「指標本身」與「指標指向的物件」。善用括號明確優先級,並畫記憶體圖追蹤每步變化,即可避開陷阱。

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