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