摘要:指針是C語言的靈魂,是C語言的精華和重要特色,理解指針的概念應從計算機存儲系統硬件結構入手。它是C語言學習的重點和難點,也是學好C語言的關鍵,針對學生在學習指針過程中遇到的困難及使用指針過程中出現的常見錯誤,該文從指針的定義、指針的基本操作、指針與其他數據類型的關系等方面對指針做詳細分析,以助學習者更好的理解與記憶。
關鍵詞:C程序設計;指針;數組;函數;字符串;內存地址;變量參數
中圖分類號:TP3112文獻標識碼:A文章編號:1009-3044(2009)35-9982-02
指針是C語言的一個重要概念。由于指針的概念比較抽象,使用起來又相對靈活,因而正確理解和運用指針就成了C語言程序設計的一個難點,掌握好指針,可以增強學生閱讀C程序的能力,可以使程序變得簡潔、緊湊和高效,同時也讓學生對“ 駕馭了” 計算機產生一種自豪感,為日后更進一步的學習奠定良好的基礎。
計算機內存中的每個存儲單元,都有一個相應編號,叫做內存地址。若在程序中定義了一個變量,C編譯系統就會根據定義中變量的類型。為其分配一定字節數的內存空間。同時建立一個變量名與地址間的對應關系。變量值就存放于該地址的內存單元中。而指針(即地址)也是一種數據類型,指針變量是只能存放地址類型數據的變量,我們把存放指針的變量稱為指針變量,簡稱指針。這個變量和基本變量的不同點就在于基本類型變量內部存儲了同類型的常量,而指針變量內部存儲的則是“同類型變量的首地址”(所指向的變量的地址)。
在C語言中,訪問數據對象一般采用直接訪問的方法,而引入指針變量的目的則是用來間接訪問數據對象,這種訪問的特點是先找到存放數據的地址,然后通過該地址來訪問數據。
指針變量的定義:基類型 *指針變量名;
此處的“*”要與指針運算符“*”區分開,前者用來標示所定義的變量是指針變量,只起到標志的作用;而后者是一個運算符,用于取該指針變量所指向的變量。無論什么樣的基類型,指針變量本身所占內存大小一般是固定的,與CPU的地址總線寬度及計算機的系統總線有關。指針變量可以指向變量,也可以指向數組、字符串,還可以指向函數。使用時要切記:一定要讓指針變量指向同類型的數據。
1 指針的基本操作
指針的基本操作包括指針賦值、取地址、判斷指針是否為空、計算兩地址間相隔元素的個數、操作符“-”或“+”運算以及指針操作符綜合運用等。
指針賦值、取地址運算在指針運用中比較普遍,如int i=5;int *ip=i;判斷指針是否為空可以用語句if(ip==0)或if(ip==NULL),其中ip為指針變量。
指針“-”或“+”一個整數n,表示將指針由當前位置移動到前面(或后面)的第n個數據處。兩指針相減的結果是兩指針之間相隔數據的個數,結果是一個整數,而不是地址。如:int a[10];int *x=a,*y=a;則x+2表示將指針x由指向a數組中第一個元素改為向后移動兩個數據,即指向第三個元素。而x-y的結果是x與y這兩個指針之間相隔數據的個數,等于2。利用這個特點,若將y指向數組a的首地址,將x移到a數組的末尾,則用x-y就可以求出數組a的長度,即a中數據的個數。
2 指針與數組的關系
指針常用于數組中,數組名本身是一個指向該數組首地址的常量指針。在應用時把數組名賦值給指針,通過指針的運算可以定位到數組中的任一元素。應用指針和數組的方式都可以訪問數組中的元素,但二者的訪問效率并不一樣。指向同一數組的兩個指針變量可作減法(結果為相隔的元素個數)及關系運算。
如:int a[5]={1,2,3,4,5},*p;