c中常會見到指針,可是指針的理解還須要要從變量中提及,先看內存空間:函數
如圖:內存是一個存放數據的空間,就像電影院同樣,都有本身的編號,這種有序的編號成爲內存編址。內存是按照字節一個一個的編址。每一個字節都有編號,咱們稱之爲內存地址。指針
如:生命週期
int i;
char b;
在使用變量的時候先申明兩個變量,系統會自動的在內存中給你申明的兩個變量分配空間:以下所示
內存
以6開始,給i分配了2個字節,給a分配了一個字節。作用域
i=30;
b= 'a';
存儲完了以後以下所示:編譯器
這時候時候 &i, &b就能夠看到當前的存儲地址;源碼
在計算機中,運算的部分主要是cpu, 但cpu不會直接和硬盤發生數據的交換,由於cup的處理速度遠遠的大於硬盤的速度。所以,他們兩個之間出現了內存這個東西,內存起到一個緩衝的做用。當程序運行的時候,首先是把程序加載到內存,而後cup從內存中取出指令以及傳輸的數據。[可是內存是掉電以後裏面的數據就會丟失,而磁盤裏面的數據會一直存在的,所以,當你關機以後,內存就會被清空,下次開機的時候重將系統程序從磁盤加載到內存,而後再執行。這種每次斷電以後開機都會從新從磁盤加載系統程序到內存的方法明顯影響了開機的速度,所以如今人們想出了一種辦法在斷電以後仍能保證內存的數據不會丟失的辦法,那就是斷電以後仍然給內存供極少的電量來保證內存的數據不會丟失,着就是所謂的低功耗。當下次打開電腦的時候,系統加載會很快。]編譯
因此說,內存是程序運行的過程當中不可缺乏的東西,如今看下編譯器是怎麼把整個內存進行分配的。咱們寫的C語言的源碼必須的轉化爲機器能識別的二進制文件,計算機纔可以運行。所以:變量
源碼通過彙編-->編譯成爲二進制文件,而後編譯器將全部的二進制文造成一個總體的二進制文件。二進制
在上述的過程當中編譯器會在內存中分出如下的幾個階段:
代碼段:代碼段用來存儲加載到內存的二進制代碼。cpu從裏面取指令。
數據段:數據段細分爲三段:
一、已初始化讀寫數據段:主要存放聲明並有初值的全局變量和加了static關鍵字的局部變量,它們的值都是能夠改變的。
二、未初始化數據段BSS:主要存放的是未初始化的全局變量和加了static關鍵字的未初始化局部變量。
三、只讀數據段:該數據段主要是存儲程序中的常量數據(內容是不能改變的),通常所稱的常量區就是指該數據段
變量或者常量在上訴幾個內存段中分配好以後,在整個程序運行過程當中都有效,生命週期從創建到整個程序運行結束才釋放,咱們稱之爲靜態存儲區。
3、初始化完成以後程序應該要執行了,在執行的過程當中會在分出兩個段:
堆:主要是提供給程序猿用malloc()函數動態分配須要的內存大小的。
棧:主要是分配函數裏面的未加static關鍵字的局部變量和函數的行參的
這兩個段是在程序運行的過程當中動態分配的,當調用函數的時候爲其行參和未加static的局部變量分配內存,當函數調用結束內存釋放,咱們稱爲動態存儲區。
註明:全局變量加關鍵字static只是影響該變量的做用域,加上了就只能在該文本文件裏面用,而不能在其餘文件裏面使用該變量。不會影響其存儲位置,有無關鍵字都是存儲在靜態存儲區裏面的。可是局部變量若加了static則會將該變量存儲在靜態存儲區裏面,不加應該是在動態存儲區棧裏面的,只是影響了存儲位置,不會影響其做用域。
補充:全局變量是在編譯的過程當中就在靜態存儲區裏面分配內存的,而局部變量則是在程序運行過程當中動態分配內存的。
盜一張圖看下:
能夠對應當前的圖進行對號查看。