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

C 語言陣列存取等價性:a[i] ≡ i[a] ≡ *(a+i) 核心原理與實證

     編輯:C 語言入門

標準定義

C 標準 (C99 §6.5.2.1) 明確定義:

a[b] ≡ *(a + b)

因此:

a[5]   ≡ *(a + 5)
5[a]   ≡ *(5 + a)
*(a+5) ≡ *(5+a)  // 加法交換律

記憶體模型解釋

  • a:陣列首元素位址 (指標常量)
  • a + i:位址偏移 i * sizeof(*a) bytes
  • *(a + i):解參考存取該位址資料
  • 加法交換律使 a+i ≡ i+a,故 a[i] ≡ i[a]

實證程式碼

#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
    
    // 進階驗證:指標變數同樣適用
    int *p = a;
    printf("p[3]     = %d\n", p[3]);      // 4
    printf("3[p]     = %d\n", 3[p]);      // 4
    
    return 0;
}

執行結果

程式執行截圖

實務意義與濫用警示

延伸:指標算術完整規則

int a[10];
int *p = a;

p + 1    // 位址 + sizeof(int) → 指向 a[1]
p - 1    // 位址 - sizeof(int) → 未定義 (超出陣列前)
&a[3]    // ≡ a + 3 ≡ p + 3
a + 10   // 指向陣列尾後一個位置 (合法但不可解參考)
a + 11   // 未定義行為

結語

a[i] ≡ i[a] 是 C 語言指標算術與下標運算子定義的直接推論,展現了陣列下標操作本質上是指標偏移加解參考的語法糖。雖然語法上合法,但工程實務中嚴禁濫用。理解此等價性有助於深度掌握指標本質、陣列退化規則、緩衝區溢位原理,是從「會用 C」進階到「懂 C」的關鍵里程碑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議理由
正常程式碼嚴禁使用 i[a]嚴重降低可讀性,違反最小驚訝原則
IOCCC/混淆代碼可作為技巧展示展示 C 語言語法靈活性
編譯器測試驗證標準合規性確保編譯器正確實作下標運算子語意
教學示範說明指標算術本質幫助理解 a[i] 語法糖本質