C語言中可以用變量和數組元素訪問內存。除此之外,C語言還允許用指針訪問內存。指針是表示內存地址的一種數據類型。用指針來編程是C語言的主要特色之一。但指針編程讓人歡喜讓人憂,喜的是:用指針可以寫出更緊湊和更高效的程序,用指針變量作為函數的參數可以改變實參的值,可以方便地處理沒有名字的數據,而且支持內存的動態分配,提高內存的使用率;憂的是:指針使用不當,很容易指到意想不到的地方,這種錯誤編譯不會報錯,所以很難被發現,而且這種錯誤可能破壞其他應用程序和數據。因此,必須徹底理解指針的相關概念,熟練掌握指針的各種應用,才能在編程中不犯錯誤,充分發揮C語言的獨特優勢,盡情領略C語言的獨特魅力和風采。
本章的內容比較豐富,概括起來包括以下四點:(1)不同類型指針變量的定義與引用;(2)用指針變量作為函數的形參;(3)字符串與多個字符串的處理方法;(4)動態存儲分配。
內存是計算機的主要組成部分,它用來容納當前正在使用的或經常使用的程序和數據。程序或數據是以二進製的形式存儲在內存的存儲單元中。為了區別不同的存儲單元,給它們各編一個號,這就像賓館中的房間,每個房間都編一個房間號一樣。每一個存儲單元有一個唯一的編號與其對應,這個編號就是這個存儲單元的地址。地址從0開始編號,每次順序地加1。在C編譯係統中,內存的地址用4位十六進製數來表示,第一個字節的地址為0000H,第二個字節的地址為0001H,其他的字節的地址以此類推。地址為0002H單元存儲的內容為34H。內存包含有大量的存儲單元,每個存儲單元可以放1個字節,內存以字節為單位存儲信息。
如果在程序中定義了一個變量,在編譯時就會在內存中為這個變量分配存儲單元。係統根據程序中定義的變量的數據類型,連續為這個變量分配一定長度的存儲空間。例如:
inti=3,j=4,k=5;
這條語句定義了三個整型變量,C語言編譯係統為每個整型變量連續分配2個字節的存儲空間,假設分配2000H、2001H給變量i,2002H、2003H給變量j,2004H、2005H給變量k。變量i的值3以二進製的形式存儲。高字節(00H)放在高地址(2001H)的存儲單元中,低字節(11H)放在低地址的存儲單元中,變量j和k的值也是這樣存儲的。變量的類型不同,在內存中占用的字節數也不一樣。例如字符型變量占1個字節,整型變量占2個字節,浮點型變量占4個字節等。到底哪個字節的地址是變量的地址呢?變量所占用內存的首字節地址稱為變量的地址,變量i占用從內存地址2000H開始的兩個字節,所以變量i的地址為2000H,同樣可知變量j的地址為2002H,變量k的地址為2004H。變量的地址總是指向該變量所占用的存儲空間,所以形象化地把一個變量的地址稱為變量的指針,簡稱指針。在C語言中,允許用一個變量來存放另一個變量或對象的地址(指針),這種變量被稱為指針變量。假設定義了一個指針變量p,我們可以用下麵語句:
p=&i;
把變量i的地址(2000H)存放到指針變量p中。也就是說指針變量p指向了變量i。
值得注意的是,變量的地址分配工作是由編譯係統完成的,用戶一般不需要關心。在程序中可以通過取地址運算符“&”來獲取它。取地址運算符會在後麵加以介紹。
指針變量也是變量,它同樣具有變量的三個要素:變量名、變量類型和變量的值。它的名字是p,它的類型是整型指針變量類型,它的值是變量i的地址。但它又不同於一般的變量,是一種特殊的變量,特殊在它的類型和值。
指針變量的類型是它所指向的變量或對象的類型。指針類型並不是它本身存放值的類型。它指向什麼類型的變量,它就是什麼類型。因此,指針變量的類型很豐富,有整型指針變量、字符型指針變量、浮點型指針變量、指向數組的指針變量、指向函數的指針變量、指向指針的指針變量等。