實驗程式碼
#include <stdio.h>
int main() {
int a = 0;
int *p = &a;
int *q = (int *)0x18FEF0; // 假設 a 的位址為 0x18FEF0
printf("&a = %p, a = %d\n", &a, a);
printf("p = %p, *p = %d\n", p, *p);
printf("q = %p, *q = %d\n", q, *q);
*q = 3; // 透過 q 修改記憶體內容
printf("修改後: a = %d, *p = %d, *q = %d\n", a, *p, *q);
return 0;
}
執行結果分析
&a = 0x18FEF0, a = 0
p = 0x18FEF0, *p = 0
q = 0x18FEF0, *q = 0
修改後: a = 3, *p = 3, *q = 3
核心概念驗證
- 變數名 = 記憶體位址的別名:
a、*p、*q 指向同一塊記憶體
- 指標存儲位址:
p、q 值均為 0x18FEF0
- 解參考修改內容:
*q = 3 直接改寫該位址資料,a、*p 同步反映
- 型別轉換:
(int *)0x18FEF0 將整數常數強制視為指標
⚠️ 現代系統警示
- 現代作業系統啟用 ASLR(位址空間佈局隨機化),變數位址每次執行不同
- 硬編碼位址
0x18FEF0 僅供教學示意,實際開發絕不可硬編碼位址
- 隨意寫入任意位址會導致 Segmentation Fault 或破壞其他程式資料
正確指標用法
int a = 0;
int *p = &a; // 取合法變數位址
*p = 3; // 透過指標修改
printf("%d", a); // 3