1.為什麼會有指針?
我們在描述一座飯店裡的客人時,經常會用該客人入住的房間号來代指該客人,比如301室,302室等等。這樣前台隻需要在抽屜裡儲存客人入住的房間牌号,在尋找該客人時,隻需要打開抽屜,拿出牌号,根據牌号的資訊就能在飯店裡找到該客人。
同樣的,對于計算機,所有的程式都要在記憶體中運作,而記憶體的容量顯然是有限的。以32位系統的計算機為例,理論上,該系統最大支援存儲2的32次方個bit位,也就是4gb記憶體。
為了有效地使用珍貴的記憶體資源,我們将計算機的記憶體按照如下方式劃分:
我們将記憶體劃分成單個的單元,為了能夠通路每一個單元,我們需要對這些劃分好的單元進行編号,正如對飯店的房間進行編号一樣。這些編号就是記憶體單元的位址。
執行個體
#include <stdio.h>
int main()
{
int num = 10;
# //取出num的位址
//注:這裡num的4個位元組,每個位元組都有位址,取出的是第一個位元組的位址(較小的位址)
printf("%p\n", &num); //列印位址,%p是以位址的形式列印
return 0;
}
結果
000000770D8FF744//十六進制
(111 0111 0000 1101 1000 1111 1111 0111 0100 0100二進制)
以上主程式過程可以了解為:
1.向記憶體申請4個位元組單元儲存一個int型變量,我把該int變量取名為num,随後将10指派給此變量,這樣這個存儲着值的名為num的變量就會儲存于申請的記憶體位元組單元内
(該存儲單元/房間号由計算機配置設定,此時我隻知道我申請的房間類型,也知道我給該房間取的名字及我在房間記憶體放的内容,但我并不知道飯店給我申請存儲的變量内容放到了何處)
2.取出num的位址
(我向前台提出訓示,我想知道我申請的房間位址,此時服務員需要打開抽屜拿出房間的牌子)
3.我要求列印出num的位址
(我要求前台展示房間牌子/位址給我)
2.如何建立指針
現在我們已經清楚了為什麼會有記憶體單元位址,我們将對進一步通過執行個體來學習指針。
執行個體
#include <stdio.h>
int main()
{
int a = 10; //向記憶體申請4字元儲存int變量 a
int* b = &a; //定義指針變量b,将存儲變量a的位址儲存在b
printf("%p\n", &a); //列印a的位址
printf("%p\n", b); //列印指針變量b的位址
return 0;
}
結果
000000FE83B6F574
000000FE83B6F574
指針實際上就是存儲變量位置的變量。當通路由a的位址确定的指針變量b的位址時,b将位址直接指向了a的位址。
此處可以了解為,我向飯店申請了一個int房間,我把房間取名為a,并在該房間存儲了内容物數值10,現在飯店按照我的要求給我配置設定好了該房間的房間号,這時候我又申請了一個特殊的指針房間為b,随後将a的房間号牌存放到了b房間内,這樣我隻需要通過一定的指令通路指針房間b,就可以得到a的房間号牌,然後根據房間号牌找到a房間裡的内容。
3.操作指針
執行個體
#include <stdio.h>
int main()
{
int a = 10;
int* b = &a;
*b = 20;
printf("%d\n", a);
return 0;
}
結果
20
我們根據變量a的位址設定了指針b,可以通過*b對指針b進行反解,通過位址直接得到a的位置,随後将新的值存放到a房間内。*b的過程叫做解引用,即通過操作指針直接更改原位址存放變量的值。
以上為指針内容的初級了解。