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

C 語言指針算術:*(3+doses) 為何等於 3[doses]?

     編輯:程式設計綜合問答

現象

int doses[] = {1, 3, 2, 1000};
printf("%d\n", doses[3]);   // 1000
printf("%d\n", 3[doses]);   // 1000
// 為什麼 *(3+doses) == 3[doses]?

標準定義

C 標準規定:a[b] 等價於 *(a + b)。加法交換律 ⇒ a + b == b + a ⇒ *(a + b) == *(b + a) ⇒ b[a] == a[b]。

推導過程

doses[3] 
→ *(doses + 3)           // 定義
→ *(3 + doses)           // 指針加法交換律
→ 3[doses]               // 定義反向應用

指針算術細節

  • doses 退化為 int*,指向首元素地址。
  • 3 + doses 將整數 3 隱式轉換為偏移量,按 sizeof(int) 縮放 → 向後 3 個 int 位置。
  • 解引用 * 取得該位置的值。

實際意義

  • **語法糖對稱性**:C 設計之初為了統一數組下標與指針算術,允許下標在前(雖極少用)。
  • **混淆代碼利器**:《國際 C 語言混淆大賽》(IOCCC) 常見技巧。
  • **無性能差異**:編譯器生成相同機器碼。

總結

*(3+doses) == 3[doses] 純屬 C 語言**下標運算符定義**與**指針加法交換律**的必然結果。理解 a[b] ≡ *(a+b) 是掌握 C 指針的核心鑰匙。

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