天天看點

c++指針(二)——定義變量時的記憶體配置設定

為什麼要講記憶體配置設定呢,因為要了解指針的實質,就必須得從了解記憶體開始~

(1)、計算機中記憶體編址

記憶體是一個存放資料的空間,進行編址之後可以對資料空間進行合理的利用和管理。記憶體編址的基本機關是位元組。

(2)、變量的定義,背後的記憶體配置設定

int a;
           

當我們定義一個int類型的變量 a 時,系統就開始準備一定的記憶體空間,這個記憶體空間的大小是int類型資料所需的記憶體大小(這個大小和具體的編譯器有關,現在的編譯器基本都是4位元組),給這個記憶體空間一個名字吧,系統看見我們給了它一個名字a,那它就叫a好了~~~,此時,a 就代表這4個位元組的空間(假設int型資料就占據4個位元組的記憶體空間)。我們可以在這四個位元組的空間裡放入任意int型數字,放入30,那 a 就是30,放入40,那 a 就是40~

那麼 a 的含義就是:

1、這個變量的名字

2、變量裡存儲的内容

要是我們比較好奇,想要知道這個a到底在哪裡呀,系統把哪塊空間配置設定給它了?

 &  這個符号就發揮了大用場, &a  就代表 a 這塊空間的位址,沿着這個位址往後的4個位元組就是 a 代表的記憶體空間~

c++中通過cout<<&a<<endl;可以輸出int型變量的位址

同樣的,我們可以定義一個字元型變量

char b;
           

當我們定義一個字元變量時,系統就開始準備一定的記憶體空間,這個記憶體空間是char型資料所占據的記憶體大小(這個大小是1個位元組),同樣,我們叫這個記憶體空間b~~~,可以将任意字元指派給b~~~

但是,直接cout<<&b<<endl;并不能像cout<<&a<<endl;一樣得到十六進制的位址,想要輸出char型變量的位址可以參考連結char型變量位址的輸出

接下來我們要進入主題——指針啦!

上一篇文章講了指針的定義,大家應該會定義一個指針了,我們以定義一個整型指針為例:

int *p;
           

當我們定義一個 int * 類型的變量時,系統就開始準備一定的記憶體空間,這個記憶體空間的大小是 int * 類型所需的記憶體大小,(所需的記憶體大小可由sizeof(int *)語句得到),給這個空間一個名字吧,系統看見我們給了它一個名字p,那它就叫 p 好了,是不是和定義一個整型變量或者是字元型變量一樣呢?是的,這個int * 的變量我們就叫它指針(或者指針變量)~~~

int類型的變量 a 裡存放的是int類型的數,我們可以用這個數字進行加減乘除運算

char類型變量 b 裡存放的是char類型的字元,我們可以用這個字元進行字元操作

那 int * 型變量裡存放的是什麼?

int * 類型變量 p 裡存放的是 int * 類型的位址,我們可以用這個位址找到記憶體中的一個存儲空間 

那麼c++要這個類型的變量有什麼用呢?比如我們要去上課,下午一共三節課,有資料結構課,有算法課,還有c++課,三節課在不同的教室,如果我們不知道c++課在哪個教室,就得挨個去看喽,如果我們知道c++課在101教室,算法課在102教室,資料結構的課在103教室,直接去101教室就好啦,起中間媒介的連接配接作用的101,102,103編号或許有助于對指針的了解。指針變量裡的内容就是編号,指針起這樣的媒介的、連接配接的、引導的作用~~~ 在計算機記憶體中,指針變量中存儲的就是編址後的記憶體的各個編号,這個編号一般叫位址

指針變量裡存儲的是位址,&a也是位址,

p是指針變量,&a是一個具體的位址,

那麼我們可以有下邊的操作:

p=&a;
           

或者在定義p的時候就指派

int *p=&a;
           

大家對指針是不是有了一定的了解呢?

(3)、& 與 *

我們先從 * 和 & 後邊接的變量以及作用說起,之後再對第一篇文章中講解的指針的定義進行更加深入的了解

& 和 * 可以了解為  對  緊接在後邊的變量  進行一定的資訊提取

& 和 * 後邊緊接的都是變量,但後邊接的變量有所不同,& 後邊緊接的是存放真實資料的變量(整型變量 a 或者是字元變量 b等),而 * 後邊緊接的是存放位址資料的變量(比如int * 類型的變量或者char *類型的變量)

&a 意味着提取變量 a 的位址,我們想要知道 a 放到哪裡了

*p意味着提取變量p裡存放的位址所對應的存儲空間裡存放的真實資料,我們想知道這個位址處放了什麼内容,101教室上的什麼課。

知道了 * 符号代表的意思,我們來看一下上一篇文章講的指針的定義~

int *p;
           

定義一個int型資料 a 時,是這樣的語句 int a; 我們不妨類比一下,把 *p 先看成一個整體, *p 就是一個整型變量。

*p是一個整型變量,我們講 * 後邊接的變量是一個指針變量,那麼 p 就是一個指針變量了,那麼 p 就是存放 *p 的記憶體的位址;

*p 是一個整型變量,同時我們能得到 &*p 就是存放 *p 的記憶體的位址;

最終我們得到 p=&*p ~~~~~~

下一篇文章,指針和數組名的關系