首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言指針算術:*(p+i) 與 p[i] 完全等價,編譯器生成相同機器碼

     編輯:程式設計疑難解答

核心結論

*(p + i) 與 p[i] 在語義上 100% 等價,C 標準定義 p[i] 即為 *(p + i) 的語法糖。編譯器生成**完全相同的機器指令**。

底層原理


int a[10];
int *p = a;  // p 指向 a[0]

// 訪問第 i 個元素
// 寫法 1:指針算術
int val1 = *(p + i);  // 1. 計算 p + i (地址 + i * sizeof(int))
                      // 2. 解引用獲取值

// 寫法 2:下標運算符
int val2 = p[i];      // 編譯器內部直接轉換為 *(p + i)
// 寫法 3:數組下標
int val3 = a[i];      // a 退化為指針,同樣轉換為 *(a + i)

優先級與結合性

表達式結合順序等價寫法
*p + i(*p) + i先解引用再加 i(值運算)
*(p + i)*(p + i)先指針加法再解引用(地址運算)
p[i]*(p + i)標準定義等價

編程風格建議

  1. 數組語境用下標 p[i]:語義清晰「第 i 個元素」,可讀性最高。
  2. 指針遍歷用指針算術:
    
    for (int *ptr = arr; ptr != arr + n; ++ptr) {
        process(*ptr);  // 避免索引計算,極致性能場景微優
    }
    
  3. 教學/面試必掌握等價關係:理解「下標是指針加法的語法糖」是指針精通的分水嶺。

進階:指針類型決定步長


int *p;     // +1 步長 4 字節 (sizeof(int))
double *q;  // +1 步長 8 字節 (sizeof(double))
struct Node *r; // +1 步長 sizeof(Node)

無論寫 *(p+i) 還是 p[i],**指針類型決定內存步長**,這才是指針算術的靈魂。

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