想弄懂指針並不容易,但生活中到處都是指針。想象一下:你要借書給朋友,朋友不在宿舍,你把書放在「2層3號書架」,然後在桌上留張紙條:「你要的書在第2層3號書架」。
i)紙條本身不是書,但通過紙條上的地址信息,你能找到書。C 語言指針同理:指針變量存儲的是內存地址編號。
聲明 int *pi; 在內存中開闢一塊固定寬度空間(32位系統 4 字節),命名為 pi。它與 int i;、char a; 本質無異——都是變量,佔據內存,有地址,有值。
內存地址 → 6 7 8 9 10 11 12 13 14
-------------------------------------
... | 30 | 't' | | | | | ...
-------------------------------------
| i | a | | | pi | |
& 與賦值pi = &i; // 取 i 的地址(假設為 6),賦給 pi
內存地址 → 6 7 8 9 10 11 12 13 14
-------------------------------------
... | 30 | 't' | | | 6 | | ...
-------------------------------------
| i | a | | | pi | |
現在 pi 的值為 6,即 i 的地址。我們說 pi 指向 i。
*:順著地址找數據printf("%d", *pi); // 輸出 30
*pi 的讀法:「pi 內容所指地址上的內容」。
pi 的值 = 6(地址)*pi = 地址 6 上的內容 = 30*pi 等價於 i& 取地址,* 取內容
指針變量存地址,解引用拿數據。
指針就是那張「紙條」,裡面寫著「書」的位置。
char a, *pa;
a = 10;
pa = &a;
*pa = 20;
printf("%d", a); // 輸出什麼?
答案:20。*pa = 20 修改的是 pa 指向的內存單元,即 a。
理解了單級指針,下一篇將挑戰 int **ppa——「指針的指針」,解鎖更高階的內存操作能力。