我們在C程序中使用變量來“代表”一個數(shù)據(jù),使用函數(shù)名來“代表”一個函數(shù),變量名和函數(shù)名是程序員使用的助記符。變量和函數(shù)最終是要放到內(nèi)存中才能被CPU使用的,而內(nèi)存中所有的信息(代碼和數(shù)據(jù))都是以二進(jìn)制的形式來存儲的,計算機(jī)根據(jù)就不會從格式上來區(qū)分哪些是代碼、哪些是數(shù)據(jù)。CPU在訪問內(nèi)存的時候需要的是地址,而不是變量名、函數(shù)名。問題來了:在程序代碼中使用變量名來指代變量,而變量在內(nèi)存中是根據(jù)地址來存放的,這二者之間如何映射(關(guān)聯(lián))起來的?答案是:編譯器!編譯器在編譯文本格式的C程序文件時,會根據(jù)目標(biāo)運(yùn)行平臺(就是編譯出的二進(jìn)制程序運(yùn)行在哪里?是x86平臺的電腦?還是ARM平臺的開發(fā)板?)來安排程序中的各種地址,例如:加載到內(nèi)存中的地址、代碼段的入口地址等等,同時編譯器也會把程序中的所有變量名,轉(zhuǎn)成該變量在內(nèi)存中的存儲地址。變量有2個重要屬性:變量的類型和變量的值。示例:代碼中定義了一個變量int a = 20; 類型是int型,值是20。這個變量在內(nèi)存中的存儲模型為:我們在代碼中使用變量名a,在程序執(zhí)行的時候就表示使用0x11223344地址所對應(yīng)的那個存儲單元中的數(shù)據(jù)。因此,可以理解為變量名a就等價于這個地址0x11223344。換句話說,如果我們可以提前知道編譯器把變量a安排在地址0x11223344這個單元格中,我們就可以在程序中直接用這個地址值來操作這個變量。在上圖中,變量a的值為20,在內(nèi)存中占據(jù)了4個格子的空間,也就是4個字節(jié)。為什么是4個字節(jié)呢?在C標(biāo)準(zhǔn)中并沒有規(guī)定每種數(shù)據(jù)類型的變量一定要占用幾個字節(jié),這是與具體的機(jī)器、編譯器有關(guān)。比如:32位的編譯器中:
char: 1個字節(jié); short int: 2個字節(jié); int: 4個字節(jié); long: 4個字節(jié)。
比如:64位的編譯器中:
char: 1個字節(jié); short int: 2個字節(jié); int: 4個字節(jié); long: 8個字節(jié)。