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

C語言冷知識:為什麼 a[i] 等價於 i[a]?指針算術本質圖解

     編輯:關於C語言

C語言冷知識:為什麼 a[i] 等價於 i[a]?指針算術本質圖解

C 標準定義下標運算符 a[b] 等價於 *(a + b)。由於加法交換律,a + i ≡ i + a,故 a[i] ≡ i[a]。本文從標準定義、指針算術、內存地址模型三個維度徹底解釋這一「反直覺」特性。

一、標準定義

a[b]  ≡  *(a + b)

因此:

a[5]  ≡  *(a + 5)
5[a]  ≡  *(5 + a)  ≡  *(a + 5)  ≡  a[5]

二、指針算術視角

  • a 是數組首元素地址(指針)。
  • a + i 向後偏移 i * sizeof(*a) 字節。
  • i + a 同理,指針與整數相加交換律成立。
  • 解引用 * 取該地址存儲的值。

三、內存模型演示

int a[10] = {9,2,3,4,7,6,5,8,1,10};
// 假設 a 首地址 0x1000,int 4 字節
// a[5]  → 地址 0x1000 + 5*4 = 0x1014 → 值 6
// 5[a]  → 地址 5 + 0x1000 = 0x1005? 不!編譯器按指針算術:5 + a → a + 5 → 同樣 0x1014 → 值 6

四、可運行驗證代碼

#include 
int main() {
    int a[10] = {9,2,3,4,7,6,5,8,1,10};
    printf("a[5]   = %d\n", a[5]);     // 6
    printf("*(a+5) = %d\n", *(a+5));   // 6
    printf("*(5+a) = %d\n", *(5+a));   // 6
    printf("5[a]   = %d\n", 5[a]);     // 6
    return 0;
}

輸出四行全為 6,證明等價性。

五、實際工程意義

  • 無實際用途:i[a] 僅為語法糖副產物,降低可讀性,嚴禁生產代碼使用。
  • 面試/考試考點:考察對 C 下標運算符本質(指針算術)的理解深度。
  • 模板元編程技巧:極少數泛型宏中利用交換律簡化表達式。

六、總結

a[i] == i[a] 直接源於 C 將下標運算定義為指針加法與解引用的組合,加法交換律導致二者等價。這體現了 C 語言「數組即指針」的核心設計哲學——看似靈活,實則要求程序員對內存模型有清晰認知。

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