4.2 指針
指針(即指針變量)是C+ +語言最大的功能之一。一個指針是一個特定類型數(shù)據(jù)的存儲地址,比如一個變量的地址。
與其他類型變量一樣,指針變量也必須要聲明。指針變量聲明的一般形式為:
<數(shù)據(jù)類型>*<變量名>;
其中,<數(shù)據(jù)類型>是指針?biāo)笇ο蟮念愋,在C+ +中可以指向任何C+ +類型。<變量名>是指針變量名。
指針使用兩種特殊的運(yùn)算符——*和&。
一元(單目)運(yùn)算符&用于返回其操作對象的內(nèi)存地址,其操作對象通常為一個變量名。例如:
ptr=&total;
把變量total的內(nèi)存地址存到指針變量ptr中。該地址是total變量在計算機(jī)內(nèi)存中的存儲地址。
第二個與指針相關(guān)的運(yùn)算符是*,它與&運(yùn)算符作用相反。作為一元運(yùn)算符的*用于返回其操作數(shù)所指對象的值,因此,該運(yùn)算符要求其操作對象為一個指針。
1指針和地址
(1)指針說明
從指針的定義可知,指針是用所指對象類型來表征的。在使用任何指針變量之前必須先給它賦一個所指合法具體對象的地址值。
如何使一個指針指向一個具體對象:
、偈褂胣ew運(yùn)算符(或malloc和alloc等函數(shù))給指針分配一個具體空間。
②將另一個同類型的指針賦給它以獲得值。
、弁ㄟ^&運(yùn)算符指向某個對象。
(2)指針運(yùn)算
盡管指針中存放的是變量的地址,但在C+ +中指針只能進(jìn)行如下運(yùn)算。
、僦羔樅驼土靠梢赃M(jìn)行加減
②若p1,p2為指針,當(dāng)p1和p2指向同一類型時,可以進(jìn)行賦值。
、蹆蓚指向同一類型的指針,可進(jìn)行= =,>,<等關(guān)系運(yùn)算,其實(shí)就是地址的比較。
、軆蓚指向同一數(shù)組成員的指針可進(jìn)行相減,結(jié)果為兩個指針之間相差元素的個數(shù)。
注意:兩指針不能相加。
2指針和數(shù)組
在C+ +中,指針和數(shù)組的關(guān)系極為密切。實(shí)際上,數(shù)組的參數(shù)傳遞、數(shù)組元素的存取,都可通過指針操作來完成。指針和數(shù)組常常可以互換。
在C+ +中,數(shù)組的名字就是指向該數(shù)組第一個元素(下標(biāo)為0)的指針,即該數(shù)組第一個元素的地址,也即數(shù)組的首地址。
一般情況下,一個數(shù)組元素的下標(biāo)訪問a[i]等價于相應(yīng)的指針訪問*(a+i)。但特別注意:數(shù)組名和指針(變量)是有區(qū)別的,前者是常量,即數(shù)組名是一個常量指針,而后者是指針變量。因此,盡管我們可寫pa=a;但不能寫:a=pa;或pa=&a;因?yàn)槲覀儾荒芨淖兂A康闹,也不能取常量的地址?/P>
數(shù)組名可作為參數(shù)進(jìn)行傳遞。當(dāng)將數(shù)組名傳給函數(shù)時,實(shí)際上所傳遞的是數(shù)組的開始地址。(即數(shù)組第一個元素的地址)
為什么要使用指針?簡單地說指針運(yùn)算比數(shù)組運(yùn)算的速度快。
此外,使用指針的另外一個原因是在大量數(shù)據(jù)傳遞時,使用傳遞指針要遠(yuǎn)比傳遞數(shù)據(jù)本身效率高的多,如在函數(shù)參數(shù)傳遞及函數(shù)返回值時。當(dāng)然,使用指針會給程序帶來安全隱患(如指針懸掛問題),同時還使得程序的可讀性降低(顯然,用數(shù)組實(shí)現(xiàn)的程序要比用指針實(shí)現(xiàn)的程序的可讀性要好)。
對于字符串常量,可以把它看成是一個無名字符數(shù)組,C+ +編譯程序會自動為它分配一個空間來存放這個常量,字符串常量的值本身就是指向這個無名字符數(shù)組的第一個字符的指針,其類型是字符指針。
3指針數(shù)組和函數(shù)指針
(1)指針數(shù)組
指針數(shù)組就是由指針組成的數(shù)組,即數(shù)組中的每一個元素都是指向同一類型對象的指針。
指針數(shù)組可以是全局的、靜態(tài)的和局部的。字符指針數(shù)組和二維字符數(shù)組在許多方面是一樣的,如初始化形式、成員訪問方式,因此我們有必要了解它們的區(qū)別和各自的使用場合。
盡管二維字符數(shù)組與字符指針數(shù)組在存儲形式上不同,但它們在初始化形式以及訪問元素方式上卻是相同的。
采用指針數(shù)組的理由是:它可以節(jié)省存貯空間,因而通常用來存放不同長度的字符串。例如,如果要保存從標(biāo)準(zhǔn)輸入或文件中讀入的行,字符指針數(shù)組是一個好的選擇。因?yàn)樽x入的行可能長短差異很大。
(2)命令行參數(shù)
在C+ +中可以實(shí)現(xiàn)帶有命令行參數(shù)的程序,它是通過main帶有參數(shù)來實(shí)現(xiàn)的。
在C+ +中,主函數(shù)main還可以帶有參數(shù),形式如下:
int main(int argc,char * argv[])
或int main(int argc,char * * argv[])
其中:
argc為包含命令本身在內(nèi)的參數(shù)個數(shù)。
argc為指針數(shù)組,數(shù)組元素為指向各參數(shù)(包含命令本身在內(nèi))的指針。
(3)函數(shù)指針
在C+ +中,允許指針指向一個函數(shù),即指向函數(shù)的指針。函數(shù)指針的說明形式為:
類型(*標(biāo)識符)();
例如:int (* fp)();定義了一個指向返回值為整型值的函數(shù)的指針fp。
注意:int(*fp)();與int*fp();的不同在于,前者是函數(shù)指針,后者為返回指向int指針的函數(shù)。
與其他類型的指針變量一樣,在使用函數(shù)指針前必須使它指向一個具體的函數(shù)。若要函數(shù)指針指向一個具體函數(shù),可通過賦值語句或參數(shù)傳遞。
函數(shù)指針=函數(shù)名;
該賦值語句將使一個函數(shù)指針指向一個具體函數(shù)(在C+ +中,函數(shù)名是作為指向函數(shù)的指針值來處理)。函數(shù)指針的最大用途是它可以使得一個函數(shù)作為其他函數(shù)的參數(shù)進(jìn)行傳遞,擴(kuò)展了函數(shù)的功能。
編輯推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |