c 指標(二) 定義變數時的記憶體分配

2021-08-19 18:28:45 字數 2233 閱讀 5083

為什麼要講記憶體分配呢,因為要理解指標的實質,就必須得從理解記憶體開始~

(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<

同樣的,我們可以定義乙個字元型變數

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

但是,直接cout<<&b接下來我們要進入主題——指標啦!

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 ~~~~~~

c中定義變數的記憶體分配順序問題

1 區域性變數,儲存在棧中,其分配位址根據變數宣告順序是遞減的,如i和j。i先宣告,i的位址高,j後宣告,j的位址低。include using namespace std int b int a int c int arr 2 int d void main int ar 2 int i int ...

變數 記憶體 指標 二

測試用 int li array 5 int p li array cout p 1 p 1 cout p 2 1 p 2 1 寫法有些不正常,但是合法,正常情況下會寫成 p 3 或是 p 3 結論1 是個與 類似的 按位址訪問資料 的運算子 1.在c 中,按位址訪問 寫讀 記憶體中資料有兩種方法 ...

C 陣列變數的記憶體分配

原則 1 簡單的值型別的陣列,每個陣列成員是乙個引用 指標 引用到棧上的空間 因為值型別變數的記憶體分配在棧上 2 引用型別,類型別的陣列,每個陣列成員仍是乙個引用 指標 引用到堆上的空間 因為類的例項的記憶體分配在堆上 class person person myperson myperson n...