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

C語言指標相關運算符與等價表達式完全解析

     編輯:關於C語言

核心運算符

1. & —— 取址運算符

  • 作用:獲取變數的記憶體位址
  • 操作數:左值(變數、陣列元素、結構成員等)
  • 結果:指向該類型的指標

2. * —— 三重身份

語境含義範例
宣告中指標宣告標識int *p;
表達式右值間接存取(取值)int x = *p;
表達式左值間接賦值(修改所指物件)*p = 10;
兩運算元皆為算術值乘法運算符a * b

合法與非法操作範例

int a, b = 20, c = 30, d = 40, *p;

p = &d;      // 合法:p 指向 d
a = *p;      // 合法:取 p 指向的值 (40) 給 a
*p = c;      // 合法:將 c (30) 存入 p 指向的位置 (d 變為 30)
*p = &b;     // 錯誤:左邊是 int,右邊是 int*,類型不匹配

核心等價表達式(指標 p 指向變數 a:int a = 20, *p = &a;)

表達式等價形式說明
*pa間接存取等於直接存取
p&a指標值等於變數位址
&*p&a / p取值後取址回到原位址
*&a*p / a取址後取值回到原值
(*p)++a++後置遞增所指物件
(*p)--a--後置遞減所指物件
++(*p)++a / ++*p前置遞增所指物件
--(*p)--a / --*p前置遞減所指物件

優先級關鍵:*p++ vs (*p)++

int arr[] = {10, 20, 30};
int *p = arr;

*p++   // 等價 *(p++):取 arr[0]=10,p 指向 arr[1]
(*p)++ // 取 arr[0]=10,arr[0] 變為 11,p 不動
++*p   // 等價 ++(*p):arr[0] 變為 11,取值 11
*++p   // 等價 *(++p):p 指向 arr[1],取值 20

記憶體模型視覺化

記憶體位址:   0x1000    0x1004    0x1008
             +------+  +------+  +------+
int a = 20:  |  20  |  (a 位於 0x1000)
             +------+

int *p = &a:  p 儲存 0x1000 (p 自身位於某位址,如 0x2000)

*p:  解引用 p -> 存取 0x1000 -> 得到 20
&a:  取 a 位址 -> 0x1000
&*p: 解引用 p -> 0x1000 -> 取址 -> 0x1000
*&a: 取 a 位址 -> 0x1000 -> 解引用 -> 20

實務建議

  • **括號明確意圖**:(*p)++ 而非 *p++ 當要修改所指值
  • **const 正確性**:const int *p (指向常量) vs int *const p (常量指標)
  • **避免多層間接**:***ppp 難以閱讀,重構為結構體或中間變數
  • **編譯器警告**:開啟 -Wall -Wextra -pedantic 捕獲指標類型不匹配

總結

& 與 * 是互逆操作:&*p == p、*&a == a。掌握它們的優先級、結合性、左值/右值語境,是寫出正確、無歧義指標代碼的基礎。

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