把變量total的內存地址存到指針變量ptr中。該地址是total變量在計算機內存中的存儲地址。第二個與指針相關的運算符是*,它與&運算符作用相反。作為一元運算符的*用于返回其操作數所指對象的值,因此,該運算符要求其操作對象為一個指針。
1.指針和地址(1)指針說明從指針的定義可知,指針是用所指對象類型來表征的。在使用任何指針變量之前必須先給它賦一個所指合法具體對象的地址值。如何使一個指針指向一個具體對象:①使用new運算符(或malloc和alloc等函數)給指針分配一個具體空間。②將另一個同類型的指針賦給它以獲得值。③通過&運算符指向某個對象。(2)指針運算盡管指針中存放的是變量的地址,但在C+ +中指針只能進行如下運算。①指針和整型量可以進行加減②若p1,p2為指針,當p1和p2指向同一類型時,可以進行賦值。③兩個指向同一類型的指針,可進行= =,>,<等關系運算,其實就是地址的比較。④兩個指向同一數組成員的指針可進行相減,結果為兩個指針之間相差元素的個數。注意:兩指針不能相加。
2.指針和數組在C+ +中,指針和數組的關系極為密切。實際上,數組的參數傳遞、數組元素的存取,都可通過指針操作來完成。指針和數組常常可以互換。在C+ +中,數組的名字就是指向該數組第一個元素(下標為0)的指針,即該數組第一個元素的地址,也即數組的首地址。一般情況下,一個數組元素的下標訪問a[i]等價于相應的指針訪問*(a+i)。但特別注意:數組名和指針(變量)是有區(qū)別的,前者是常量,即數組名是一個常量指針,而后者是指針變量。因此,盡管我們可寫pa=a;但不能寫:a=pa;或pa=&a;因為我們不能改變常量的值,也不能取常量的地址。數組名可作為參數進行傳遞。當將數組名傳給函數時,實際上所傳遞的是數組的開始地址。(即數組第一個元素的地址)為什么要使用指針?簡單地說指針運算比數組運算的速度快。此外,使用指針的另外一個原因是在大量數據傳遞時,使用傳遞指針要遠比傳遞數據本身效率高的多,如在函數參數傳遞及函數返回值時。當然,使用指針會給程序帶來安全隱患(如指針懸掛問題),同時還使得程序的可讀性降低(顯然,用數組實現的程序要比用指針實現的程序的可讀性要好)。對于字符串常量,可以把它看成是一個無名字符數組,C+ +編譯程序會自動為它分配一個空間來存放這個常量,字符串常量的值本身就是指向這個無名字符數組的第一個字符的指針,其類型是字符指針。
3.指針數組和函數指針(1)指針數組指針數組就是由指針組成的數組,即數組中的每一個元素都是指向同一類型對象的指針。指針數組可以是全局的、靜態(tài)的和局部的。字符指針數組和二維字符數組在許多方面是一樣的,如初始化形式、成員訪問方式,因此我們有必要了解它們的區(qū)別和各自的使用場合。盡管二維字符數組與字符指針數組在存儲形式上不同,但它們在初始化形式以及訪問元素方式上卻是相同的。采用指針數組的理由是:它可以節(jié)省存貯空間,因而通常用來存放不同長度的字符串。例如,如果要保存從標準輸入或文件中讀入的行,字符指針數組是一個好的選擇。因為讀入的行可能長短差異很大。(2)命令行參數在C+ +中可以實現帶有命令行參數的程序,它是通過main帶有參數來實現的。在C+ +中,主函數main還可以帶有參數,形式如下:int main(int argc,char * argv[])
或int main(int argc,char * * argv[])
其中:argc為包含命令本身在內的參數個數。argc為指針數組,數組元素為指向各參數(包含命令本身在內)的指針。(3)函數指針在C+ +中,允許指針指向一個函數,即指向函數的指針。函數指針的說明形式為:類型(*標識符)();例如:int (* fp)();定義了一個指向返回值為整型值的函數的指針fp。注意:int(*fp)();與int*fp();的不同在于,前者是函數指針,后者為返回指向int指針的函數。與其他類型的指針變量一樣,在使用函數指針前必須使它指向一個具體的函數。若要函數指針指向一個具體函數,可通過賦值語句或參數傳遞。函數指針=函數名;該賦值語句將使一個函數指針指向一個具體函數(在C+ +中,函數名是作為指向函數的指針值來處理)。函數指針的最大用途是它可以使得一個函數作為其他函數的參數進行傳遞,擴展了函數的功能。 【考點二】 引用
1.引用的概念引用是個別名,建立時須用另一個數據對象(如一個變量)的名字進行初始化,以指定該引用所代表的數據對象。此后,對引用的任何實操作實際上就是對所代表的數據對象的操作。一個引用變量要占用相當于一個指針所需要的空間,但系統(tǒng)不會為它所代表的數據對象再次分配空間。在類型名后跟引用運算符"&",以及引用名來創(chuàng)建一個引用。引用名就是一個變量名。注意:引用運算符與地址操作符使用相同的符號(即運算符重載),但它們含義不一樣。引用運算符只在聲明變量的時候使用,它放在類型名后面。使用引用時應遵循一定的規(guī)則:(1)引用被創(chuàng)建時,它必須立即被初始化(指針則可以在任何時候被初始化)。(2)一旦一個引用被初始化為一個對象的引用,它就不能再被改變?yōu)閷α硪粋對象的引用。(指針則可以在任何時候改變?yōu)橹赶蛄硪粋對象。)(3)不可能有NULL引用。必須確保引用是具體合法的對象的引用(即引用應和一塊合法的存儲空間關聯)。
2.用引用傳遞函數參數引用的一個重要用途就是作為函數的參數。在C+ +中,函數參數傳遞采用的是傳值,如果要有占用空間大的對象(例如一個大的結構對象或類對象)需要作為函數參數傳遞的時候,在C語言中的做法往往是使用指針,因為這樣可以避免將整個實參對象數據全部拷貝給形式參數,可以提高程序的執(zhí)行效率。在C+ +中,既可以使用指針,但由于C+ +引入了引用概念,亦可以用引用來做同樣的事情。引用作為參數的最大好處是:引用參數既可以像指針那樣工作,其使用方式又和一般變量相同。也就是說,引用比指針具有更好的可讀性。 【考點四】
動態(tài)存儲分配動態(tài)存儲分配功能在C+ +中是通過new和delete運算符來實現的。
1.使用new獲得動態(tài)內存空間運算符new用于申請動態(tài)存儲空間,它的操作數為某種數據類型且可以帶有初值表達式或元素個數。new返回一個指向其操作類型變量的指針。使用new對某種類型變量進行動態(tài)分配的語法格式為:<指針>=new<類型>;
其中,<類型>表示要分配的變量類型(如char、int、double);<指針>表示指向<類型>類型變量的指針(如char*、int*、double*等)。
2.使用delete釋放動態(tài)內存空間當動態(tài)分配的內存空間在程序中使用完畢之后,必須顯式地將它們釋放。這樣做的目的是把閑置不用的堆內存歸還給系統(tǒng),使其可以被系統(tǒng)重新分配。在C+ +程序中由new分配的動態(tài)內存空間必須通過delete運算符釋放。使用delete對動態(tài)分配的單個變量進行釋放的語法格式為:delete<指針>;
其中,<指針>表示指向單個變量的指針。使用delete對動態(tài)分配的數組進行釋放的語法格式為:delete[]<指針>;
其中,<指針>表示指向數組首元素的指針。delete之后的方括號指明將要釋放的內存空間中存儲著數組元素。程序中需要分配動態(tài)內存空間,則new和delete總是成對出現的。
希望與更多計算機等級考試的網友交流,請進入計算機等級考試論壇
更多信息請訪問:考試吧計算機等級考試欄目
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |