我們都知道指標在計算機中占有很重要的部分,但指標究竟是什麼呢?有人說:指標就是位址,因為指標都是指向乙個位址空間的,。這麼說也沒毛病,但不準確。
例如: int a=10; int * p=a; 很顯然指標變數p中所存的是&a,不過這只是指標變數的一部分,是指標變數作為左值的表現,還有指標變數作為右值的呢,那麼p表示的就是指標內容了。
不過在位址空間中也有不同的區域,請看下圖:
這裡重點介紹一下堆區和棧區。
堆和棧是相對而生的,如圖所示,棧向下,堆向上。也就是說,儲存時,如果在棧中,那麼位址是由高到低存的,在堆中,那麼位址是由低到高存的,要是不信,請看下面的**:
#include
#include
int g_val=10;
static int gs_val=20;
int main()
下面請看結果:
我們來看一下,heap表示的是堆區,在堆區中的分別是:002f1b98~002f1bbc和002f1bf0~002f1c14,可以看出兩個都是由低到高的,;同樣的,來看在棧中的a,b,c位址就是由高到低的,這就堆和棧的相對性,接下來看array,我們發現在棧所分配的陣列中還是由低到高的,可以看出,分配位址時,是先給整個陣列分配,再在陣列中分配。
最後再說一點,位址空間和物理記憶體完全不一樣。
程式位址空間
上圖也可以進一步細分 1.棧區 棧又叫堆疊,通常存放程式臨時建立的非靜態區域性變數 即函式大括號中定義的區域性變數 以及函式呼叫時的引數,呼叫後的返回值等。由編譯器自動分配釋放。棧是向下增長的。棧具有 小記憶體 自動化 可能會溢位 的特點。棧頂的位址和棧的最大容量一般是系統預先規定好的,通常不會太大...
程式位址空間
乙個全域性變數,在子程序中修改後,列印100,父程序還是列印1 資料不同,表示肯定沒有使用同一塊記憶體空間 一塊記憶體空間不能儲存兩個資料 父子程序列印的資料不同,但是位址卻是相同的 此處產生矛盾,因為實際程序中訪問的位址都是虛擬位址,且程式位址空間時機上也是乙個程序的虛擬位址空間。size 表示記...
Linux 程式位址空間
我們所說的位址是乙個虛擬的位址空間,只是一堆位址編號的描述,非物理記憶體位址 虛擬位址不具備儲存能力,資料儲存依然放到物理記憶體中 程序中訪問的位址都是虛擬位址,非物理記憶體位址 程式位址空間也是乙個虛擬位址空間,是作業系統為程序通過乙個mm struct 結構體所描述的乙個假的位址空間 mm st...