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

C 語言進階筆記(十四):指針與數組——指針運算、下標等價、常量陷阱與內存屬性修改實驗

     編輯:關於C語言

指向數組元素的指針

int a[5], *p = &a[0]; 等價於 p = a;(數組名 = 首地址)。
定義時初始化:int *p = a; 或 int *p = &a[0];

引用元素:下標法 vs 指針法

  • p = &a[1]; *p = 10; ⇔ a[1] = 10;
  • p + 1 指向下一元素。結論:指針 + n ≡ p + n × sizeof(type)
  • p+i、a+i 均為 &a[i];*(p+i)、*(a+i) 均為 a[i]

遍歷數組三種寫法


// 1. 指針變量
for (int i=0; i<5; i++) printf("%p:%d ", p+i, *(p+i));
// 2. 數組名
for (int i=0; i<5; i++) printf("%p:%d ", a+i, *(a+i));
// 3. 指針自增(推薦風格)
for (int *p = a; p < a+5; p++) printf("%p:%d ", p, *p);

輸出地址遞增 4(int 4 字節),值 1~5。

⚠️ 致命錯誤:數組名不可自增

編譯錯誤:數組名不可修改

數組名是常量,不能做 ++/--/賦值!

選擇建議

優先下標法:效率不低於指針法,可讀性強。

指針減法陷阱

指針減法結果為元素個數

兩地址相減結果除以 sizeof(type),得元素個數差(圖中結果為 1,非 4)。

求數組長度技巧(理解內存用)

指針減法求長度

&a[5] - &a[0] = 5。僅供理解內存佈局,實際代碼請用 sizeof(a)/sizeof(a[0])。

字符串常量區修改實驗

運行報錯:常量區不可寫

字符串字面量存只讀區,嘗試修改報錯。
破解:二進制編輯器修改 PE 標誌 0x40 (只讀) → 0xC0 (讀寫)。
PE 標誌修改前
PE 標誌修改後
運行成功:szMsg:HelLo, pszMsg:HelLo / szMsg:6, pszMsg:4。
原理:0x40 = 可讀不可寫,0xC0 = 可讀可寫。僅供實驗,生產嚴禁!

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