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)。printf("%d\n", (double *)p);:印出位址值(以整數形式),非陣列內容。printf("%d\n", *q);:q 指向陣列起始,輸出 a[0] = 3。*x 以 double 解讀 int 陣列前 8 bytes,產生亂碼;*y 回傳第一個 int。避免對不同型別指標進行強制轉型後解參考。若需位元組級操作,請使用 char* 或 uint8_t*,並手動處理位元組序與對齊。