在程序中聲明變量后,編譯器就會(huì)為該變量分配相應(yīng)的內(nèi)存單元。也就是說,每個(gè)變量在內(nèi)存會(huì)有固定的位置,有具體的地址。由于變量的數(shù)據(jù)類型不同,它所占的內(nèi)存單元數(shù)也不相同。如下列聲明了一些變量和數(shù)組。
int i = 18; // 聲明整形變量 i ,并賦值
char c[5] = { 89, 90, 91, 92, 93 }; // 聲明字符型數(shù)組 c 并初始化
float f = 12.89; // 聲明單精度浮點(diǎn)型變量 f 并賦值
double d = 1.414213; // 聲明雙精度浮點(diǎn)型變量 d 并賦值
在程序編譯時(shí),編譯器將制定這些變量和數(shù)組所需要的存儲(chǔ)空間長(zhǎng)度。程序運(yùn)行中,則由操作系統(tǒng)為這些變量和數(shù)組分配內(nèi)存單元。整形變量所占用的內(nèi)存為 2 字節(jié),長(zhǎng)度為 5 的字符型數(shù)組所占用的內(nèi)存為 5 字節(jié),單精度浮點(diǎn)型變量所占用的內(nèi)存為 4 字節(jié),雙精度浮點(diǎn)型所占用的內(nèi)存為 8 字節(jié)。由于計(jì)算機(jī)內(nèi)存最小的尋址單位是字節(jié),設(shè)變量的存放從內(nèi)存 3000 單元開始,則操作系統(tǒng)為這些變量和數(shù)組分配內(nèi)存單元,如下圖所示:

二維數(shù)組在內(nèi)存中存放的位置示意圖
變量在內(nèi)存中按照數(shù)據(jù)類型的不同所占內(nèi)存的大小也不同,每個(gè)變量都有具體的內(nèi)存單元地址,如變量 i 在內(nèi)存的地址是 3000,占據(jù) 2 個(gè)字節(jié)后,數(shù)組 c 的內(nèi)存首地址就為 3002,變量 f 的內(nèi)存地址為3008等。對(duì)內(nèi)存中變量的訪問,過去用“scanf("%d", &a)”表達(dá)式將數(shù)據(jù)輸入變量的地址所指示的內(nèi)存單元。那么,訪問變量,首先因找到其內(nèi)存的地址,或者說,一個(gè)地址唯一指向一個(gè)內(nèi)存變量,稱這個(gè)地址為變量的指針。如果將變量的地址保存在內(nèi)存的特定區(qū)域,用變量來存放這些地址,這樣的變量就是指針變量,通過指針對(duì)所指向變量的訪問,也就是一種對(duì)變量的間接訪問。
假設(shè)一組指針變量 pi、pc、pf、pd 分別指向上述的變量或數(shù)組 i、c[]、f、d,指針變量也同樣被存放在內(nèi)存,二者的關(guān)系如下圖所示。指針變量的存儲(chǔ)空間中存放的數(shù)據(jù)為對(duì)應(yīng)變量或數(shù)組的內(nèi)存地址,通過該地址就可以訪問對(duì)應(yīng)的變量或數(shù)組。

指針變量與所指向變量的映射關(guān)系