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

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

指針變量與所指向變量的映射關系