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

C 語言指標與陣列地址操作的輸出結果分析

     編輯:程式設計綜合問答

程式碼片段

int a[5] = {3,4,8,9,10};
double *p = (double *)&a;
printf("%d\n", (double *)p);
int *q = p;
printf("%d\n", *q);

(後續類似測試略)

核心概念解析

  • 指標型別決定運算步長:double *p 指向 int 陣列,編譯器仍視 p 為 double*,故 p+1 會移動 sizeof(double) 位元組(通常 8 bytes),而非 sizeof(int)(4 bytes)。
  • 強制轉型不改變記憶體佈局:(double *)&a 只是告訴編譯器「把這塊記憶體當作 double 陣列」,實際資料仍是 int 陣列。解參考 *p 會嘗試讀取 8 bytes 並解讀為 double,導致數值錯誤。
  • 指標指派傳遞位址:int *q = p; 將 p 的位址賦給 q,此時 q 為 int*,*q 正確讀取第一個 int(3)。

各輸出說明

  1. printf("%d\n", (double *)p);:印出位址值(以整數形式),非陣列內容。
  2. printf("%d\n", *q);:q 指向陣列起始,輸出 a[0] = 3。
  3. 後續測試同理:*x 以 double 解讀 int 陣列前 8 bytes,產生亂碼;*y 回傳第一個 int。

最佳實務

避免對不同型別指標進行強制轉型後解參考。若需位元組級操作,請使用 char* 或 uint8_t*,並手動處理位元組序與對齊。

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