C語言記憶體模型與指標以及變數的關係

2021-08-09 08:10:19 字數 1684 閱讀 4526

記憶體模型(記憶體分割槽)圖

**示例

#include 

int gdata1 = 10;//.data

int gdata2 = 0;//.bss

int gdata3;//.bss段程序執行時,作業系統為.bss初始化為0

static

int gdata4 = 11;//.data

static

int gdata5 = 0;//.bss

static

int gdata6;//.bss

int main()

1.我們一般程式設計所說的記憶體是虛擬記憶體。我們程式設計提到的記憶體都是抽象的概念,是虛擬的記憶體,並不是實在的物理記憶體。物理記憶體就是我們看得到摸得著的記憶體條。而我們需要了解的就是虛擬記憶體。出了寫驅動等級別的程式外,一般是不需要了解具體的記憶體的,作業系統會將虛擬記憶體轉換成物理記憶體。

2.虛擬記憶體是程序所在的位址空間。

(1)虛擬記憶體是給每乙個程序的乙個記憶體空間。每乙個程序都有乙個虛擬記憶體空間,程序之間的虛擬記憶體是隔絕的,相互不能重疊。

(2)而虛擬記憶體的大小則是根據作業系統的位數來決定的,比如32位作業系統,則虛擬記憶體大小為2的32次方。這個通常叫做程序的位址空間。

(3)如果程序間需要通訊,則需要通過程序間通訊(ipc)來實現。這是虛擬記憶體的乙個補充機制。

3.虛擬記憶體記憶體是線性的。

物理記憶體的實現,和具體的記憶體品牌公司的策略有關。實際的物理記憶體很多都不是線性排開的,但是通過記憶體機制,對外展示成線性的邏輯位址,即從0一直到最大位址。而這個邏輯的記憶體模型,則表現在系統中的虛擬記憶體則是在此基礎上的進一步的抽象。不過,只要記住一點,虛擬記憶體是線性的。線性即表示在一條線上就可以表示所有的位址,而不需要通過幾個層次結構來定位乙個記憶體位址。

(1)指標是乙個型別,占用的位元組數與作業系統的位數有關。而作業系統的位數,決定虛擬記憶體的大小。如果是32位,則虛擬記憶體位址就是2的32次方個位元組;如果是64則虛擬記憶體位址就是2的64個位元組。

(2)而這麼大的位址,需要指標能夠全部索引到。所以,指標的值必須能夠表示這麼多個數字,而在32位作業系統中,則指標的值需要能夠表示2的32次方個數,那麼需要的就是32位的記憶體,即4位元組。所以在32位系統中,指標只要是4位元組就夠了。不管是什麼型別的指標,都是4位元組。而在64位系統中,需要64位的指標,即8位元組的指標。這4位元組或者8位元組就是必需的大小。

(3)如果指標超過這個需要的值,純粹是浪費,如果小於這個需要的值,則不能夠所引到記憶體的後面的部分。這也是,32位作業系統支援的最大記憶體是4gb,多了指標無法索引到,也就無法操作大於4gb記憶體位置。

(4)然後,記憶體位址是什麼?

記憶體位址,由上圖可以看出,記憶體位址就是記憶體單元的編號而已。

最後,變數就是一定大小的記憶體塊,而變數名就是乙個符號,由編譯器處理,然後將記憶體塊對映到變數。因此對變數的操作其實就是對對應的記憶體塊的操作。

參考

C語言,變數與記憶體

符號位 最高位為符號位,正數該位為0,負數該位為1 任何數值在記憶體中都是以補碼的形式儲存的。1 10的二進位制形式 1000 0000 0000 0000 0000 0000 0000 1010 原 2 除符號位取反 1111 1111 1111 1111 1111 1111 1111 0101 ...

c語言高階 多級指標記憶體模型

指標的最大作用 間接賦值 推論 n級指標形參可以間接改變n 1及指標實參的值 指標作用 通過函式引數來為二級指標分配記憶體,間接賦值,記憶體 為二級指標分配記憶體 int getmem char p3 int num tmp char malloc sizeof char num if tmp nu...

指標變數在記憶體中佔 C語言中的指標變數

我想大家應該都知道,指標是c語言的靈魂,我的這種說法應該不是很過分,因為在c語言中,指標真的很重要。指標很強大,並且具有很強的靈活性。指標變數為什麼都是4個位元組的?因為我麼通常使用的都是32位的計算機,記憶體位址都是32位的整數,而指標變數的實質就是記憶體位址。什麼是指標變數?存放位址的變數成為指...