天天看點

指針基礎(day2)

1.為什麼會有指針?

我們在描述一座飯店裡的客人時,經常會用該客人入住的房間号來代指該客人,比如301室,302室等等。這樣前台隻需要在抽屜裡儲存客人入住的房間牌号,在尋找該客人時,隻需要打開抽屜,拿出牌号,根據牌号的資訊就能在飯店裡找到該客人。

同樣的,對于計算機,所有的程式都要在記憶體中運作,而記憶體的容量顯然是有限的。以32位系統的計算機為例,理論上,該系統最大支援存儲2的32次方個bit位,也就是4gb記憶體。

為了有效地使用珍貴的記憶體資源,我們将計算機的記憶體按照如下方式劃分:

指針基礎(day2)

我們将記憶體劃分成單個的單元,為了能夠通路每一個單元,我們需要對這些劃分好的單元進行編号,正如對飯店的房間進行編号一樣。這些編号就是記憶體單元的位址。

執行個體

#include <stdio.h>

int main()

{

   int num = 10;

   &num;                             //取出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的過程叫做解引用,即通過操作指針直接更改原位址存放變量的值。

以上為指針内容的初級了解。