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

C語言指標轉換與陣列偏移深度解析:char* 與 long* 的記憶體操作

     編輯:C 語言問答

程式碼與問題

main() {
    char *p1 = "stuents", *p2;
    long int *p3;

    p3 = (long*)p1;
    p3++;
    p2 = (char*)p3;
    printf("%s\n", p2);
}

輸出結果為 nts。初學者常困惑於 p3 = (long*)p1 這類指標轉換的含義,本文將從記憶體模型角度詳細拆解。

記憶體佈局視覺化

字串 "stuents" 在記憶體中連續儲存(含結尾 \0):

位址偏移01234567
字元stuents\0
p1 指向▼

逐步執行解析

  1. p3 = (long*)p1:將 char* 強制轉型為 long*。p3 現在指向字串起始位址,但編譯器視其為指向 long 型資料(通常 4 或 8 位元組,視架構而定,此處假設 32 位系統為 4 位元組)。
  2. p3++:指標遞增。對 long* 而言,++ 會增加 sizeof(long) 位元組(4 位元組)。p3 從偏移 0 移至偏移 4,指向字元 'n'。
  3. p2 = (char*)p3:轉回 char*,p2 指向偏移 4 位置的 'n'。
  4. printf("%s", p2):從 p2 起印出字串,輸出 nts。

等效簡化寫法

整段程式等價於:

p2 = p1 + 4;  // 直接以 char* 偏移 4 字元
printf("%s", p2);

核心觀念總結

  • 指標轉型改變的是編譯器對記憶體的「解讀方式」,不改變實際位址值。
  • 指標運算步長取決於指標類型:char* 步長 1 位元組,long* 步長 sizeof(long) 位元組。
  • 字串本質是 char 陣列,%s 從指標位置讀取直到遇到 \0。
避坑提醒:隨意在不同類型指標間轉換並解參考,可能違反嚴格別名規則,導致未定義行為。教學範例僅為展示指標運算原理,實務開發應避免此類寫法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved