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

C++ 指針算術與內存佈局:char[] 轉 long* 後 ++ 操作解析

     編輯:程式設計疑難解答

代碼

char str[] = "12345";
long *pLong = (long*)str;
pLong++;
printf("%d\n", (int)*pLong); // 假設修正為解引用打印

內存佈局 (小端模式)

`str` 內存(十六進制 ASCII):

地址:  str   str+1 str+2 str+3 str+4 str+5
值 :  '1'  '2'   '3'   '4'   '5'   '\0'
Hex:  0x31 0x32  0x33  0x34  0x35  0x00

指針運算

  • `pLong` 指向 `str` 起始,類型 `long*`(假設 4 字節)。
  • `pLong++` 向後移動 **`sizeof(long)` 字節**(4 字節),指向 `str+4`。
  • 解引用 `*pLong` 讀取 4 字節:`str[4]..str[7]` → `0x35 0x00 0x00 0x00`(超出數組屬未定義行為,但實驗中常為 0)。
  • 小端模式下該 4 字節整數值為 `0x00000035 = 53`(即字符 `'5'` 的 ASCII 碼)。

結果

輸出 `53`。若打印 `%d` 對應 `pLong` 地址值則輸出地址數字;題目圖片輸出 `53` 符合解引用後的 ASCII 碼。

警示

**嚴格別名規則違規**:`char[]` 通過 `long*` 訪問屬未定義行為。實際工程中請用 `memcpy` 或 `union` 進行類型轉換。

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