版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第7章 指針與引用指針和引用被認(rèn)為是C+中的特殊數(shù)據(jù)類(lèi)型,它與前面章節(jié)介紹的基本數(shù)據(jù)類(lèi)型不同。使用指針和引用可使程序簡(jiǎn)潔、緊湊和高效,所以對(duì)于每一個(gè)學(xué)習(xí)C+語(yǔ)言的人,都要掌握指針和引用的使用方法。指針和引用的用法比較特殊,而且運(yùn)用非常靈活。本章將詳細(xì)講述指針和引用的概念和使用。7.1 指針概述計(jì)算機(jī)的數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中,內(nèi)存是按字節(jié)排列的存儲(chǔ)空間,每個(gè)字節(jié)都有一個(gè)編號(hào),被稱(chēng)為地址,程序中用到的數(shù)據(jù)和聲明的變量都存放在這一個(gè)個(gè)字節(jié)中,不同類(lèi)型的數(shù)據(jù)和變量占用的字節(jié)字?jǐn)?shù)不同,習(xí)慣上將某個(gè)變量占用的字節(jié)數(shù)稱(chēng)為內(nèi)存單元,指針就是記錄這些地址的變量,而指針的類(lèi)型表示指針指向地址存儲(chǔ)的數(shù)據(jù)類(lèi)型。準(zhǔn)確地理
2、解指針的概念是掌握指針的前提。 7.1.1 指針的基本概念簡(jiǎn)單地說(shuō),指針是一個(gè)地址,它指向存儲(chǔ)某一個(gè)數(shù)據(jù)的存儲(chǔ)地址。此外,還有一個(gè)指針變量的概念如圖7-1所示。圖7-1 指針變量及其訪(fǎng)問(wèn)方法在現(xiàn)實(shí)生活中,指針的概念也是比較常見(jiàn)的。例如,高速公路上的交通指示牌指示了某地的地理位置,這就是指針,而這個(gè)指示牌就是指針變量,用于存儲(chǔ)指針,如圖7-2所示。圖7-2 指針的概念在C+中,如果在內(nèi)存中存儲(chǔ)了一個(gè)變量a,其值為100,那么用通過(guò)指針變量p訪(fǎng)問(wèn)該變量的流程如圖7-3所示。圖7-3 指針可以看到,指針變量p指向變量a。在理解“指向”的時(shí)候,應(yīng)該了解指針變量p中存有變量a的地址,通過(guò)該地址就能找到變
3、量a。因此,在C+語(yǔ)言中用指針來(lái)表示指向關(guān)系,即指針就是地址。注意:在C+具體程序中參加數(shù)據(jù)處理的量不是指針本身的量,而是指針?biāo)赶虻淖兞?,即指針?biāo)赶虻膬?nèi)存區(qū)域中的數(shù)據(jù)(稱(chēng)為指針的目標(biāo))才是需要處理的數(shù)據(jù)。7.1.2 定義指針變量指針是一種復(fù)合型的數(shù)據(jù)類(lèi)型,基于該類(lèi)型聲明的變量稱(chēng)為指針變量,該變量存放在內(nèi)存中的某個(gè)地址,與其他基本數(shù)據(jù)類(lèi)型一樣,使用指針之前也必須先定義指針變量。在C+中,定義指針變量的一般形式如圖7-4所示。圖7-4 定義指針變量的一般形式需要注意的是,定義一個(gè)指針變量必須用符號(hào)“*”,它表明其后的變量是指針變量,但不要認(rèn)為“*p”是指針變量,指針變量是p而不是*p。此外,有
4、相同存儲(chǔ)類(lèi)型和數(shù)據(jù)類(lèi)型的指針可以在一行中說(shuō)明,也可以和同類(lèi)型的普通變量在一起說(shuō)明,如圖7-5所示。圖7-5 指針變量的說(shuō)明當(dāng)在一行中定義多個(gè)同一類(lèi)型的指針時(shí),用逗號(hào)隔開(kāi)各指針變量標(biāo)識(shí)符,并且每個(gè)變量前都要加上“*”。否則該變量就不是一個(gè)指針,而是一個(gè)普通類(lèi)型的變量。如圖7-6中定義的變量語(yǔ)句。圖7-6 不加“*”含義不同注意:定義指針變量時(shí),“*”可以出現(xiàn)在類(lèi)型名和變量名之間的任何位置,如下int *p,q;等價(jià)于:int* p,q;p是整型指針變量,q是整型變量。第二種寫(xiě)法容易理解為p,q都是指針變量。故建議寫(xiě)成第一種形式。指針變量存儲(chǔ)的內(nèi)容是內(nèi)存中某個(gè)字節(jié)的地址,指針變量占用的內(nèi)存字節(jié)數(shù)隨
5、系統(tǒng)的不通而不同。7.1.3 初始化指針定義了一個(gè)指針后,在使用此指針前,必須給它賦一個(gè)合法的值。在C+中,可以在定義指針的同時(shí)通過(guò)初始化來(lái)給指針賦值,也可以在使用之前給指針賦值。一般來(lái)說(shuō),C+在定義指針的同時(shí)初始化指針的形式如圖7-7所示。圖7-7 C+在定義指針的同時(shí)初始化指針的形式注意:當(dāng)把一個(gè)變量的內(nèi)存地址作為初始值賦給指針時(shí),該變量必須在指針初始化之前已做說(shuō)明,因?yàn)樽兞恐挥性谡f(shuō)明之后才被分配一定的內(nèi)存地址。此外,該變量的數(shù)據(jù)類(lèi)型必須與指針的數(shù)據(jù)類(lèi)型一致,因此不能將一個(gè)浮點(diǎn)型變量的地址賦值給整型的指針變量。同時(shí),也可以向一個(gè)指針賦初值作為另一個(gè)指針變量,即把另一個(gè)已經(jīng)初始化的指針賦給一
6、個(gè)指針。此時(shí),這兩個(gè)指針指向同一變量的內(nèi)存地址,如圖7-8所示。圖7-8 兩個(gè)指針指向同一變量的內(nèi)存地址指針的初始化在具體程序中非常重要,一旦指針的初始化出現(xiàn)問(wèn)題,就可能導(dǎo)致程序崩潰?!臼纠?-1】下面程序定義了整型指針變量p1和p2,并為其賦初值,其實(shí)現(xiàn)代碼及結(jié)果如圖7-9所示。圖7-9 指針的初始化實(shí)例注意:在給指針變量初始化時(shí),不能為其賦一個(gè)常量,否則程序?qū)⑼ú贿^(guò)編譯。此外,上述程序中使用*p1和*p2取出其中存儲(chǔ)的變量a的值,這是下面將要介紹的指針的訪(fǎng)問(wèn)問(wèn)題。7.2 指針的訪(fǎng)問(wèn)如果定義一個(gè)指針,并使其值為某個(gè)變量的地址,則可以通過(guò)這個(gè)指針間接地訪(fǎng)問(wèn)在這個(gè)地址中存儲(chǔ)的值。如示例7-1中,
7、通過(guò)*符號(hào)取出存儲(chǔ)在該地址中的值。事實(shí)上,在C+中有兩個(gè)有關(guān)指針訪(fǎng)問(wèn)的運(yùn)算符,下面將依次進(jìn)行說(shuō)明。7.2.1 指針的值指針的值是一個(gè)地址。在C+中,為了取得一個(gè)變量的地址,引入了取地址運(yùn)算符“&”來(lái)取得一個(gè)變量的地址,其語(yǔ)法如圖7-10所示。圖7-10 取地址運(yùn)算符&注意:取地址運(yùn)算符&只能應(yīng)用于內(nèi)存中存在的數(shù)據(jù),如變量、數(shù)組元素等,不能用于表達(dá)式、常數(shù)或寄存器變量?!臼纠?-2】下面示例定義了兩個(gè)指針變量p1和p2,其都指向整型變量a后將值分別輸出,其實(shí)現(xiàn)代碼及結(jié)果如圖7-11所示。圖7-11 指針的值實(shí)例上述代碼在指針的定義中,指針變量是p1和p2而不是*p1和*p2,因此要對(duì)一個(gè)指針賦值
8、,等號(hào)左邊不應(yīng)該加*號(hào)。注意:C+中不允許把一個(gè)無(wú)效的地址,比如數(shù)字賦給指針。指針變量和一般的變量是類(lèi)似的,存放的值是可以改變的。7.2.2 訪(fǎng)問(wèn)指針數(shù)據(jù)通過(guò)&運(yùn)算符可以獲取變量的地址,可將其賦值給指針,即完成了將指針指向該變量的操作。而C+可以通過(guò)“*”運(yùn)算符將指針指向的變量值取出,進(jìn)行各種運(yùn)算。在C+中,*運(yùn)算符為取值運(yùn)算符,也稱(chēng)為指針運(yùn)算符、指向運(yùn)算符或間接運(yùn)算符,*p代表p所指向的變量?!臼纠?-3】下面程序接收用戶(hù)從鍵盤(pán)輸入的兩個(gè)整數(shù),并通過(guò)*運(yùn)算符將指針變量p1和p2的值取出并輸出,其實(shí)現(xiàn)代碼及結(jié)果如圖7-12所示。圖7-12 訪(fǎng)問(wèn)指針數(shù)據(jù)實(shí)例通過(guò)指針來(lái)訪(fǎng)問(wèn)變量是一種間接的方式,其
9、速度略慢于直接訪(fǎng)問(wèn)。但給程序的開(kāi)發(fā)帶來(lái)了很大的靈活性,其原因在于指針也是一個(gè)變量,可以在運(yùn)行時(shí)修改其指向,從而達(dá)到“使用一個(gè)指針,訪(fǎng)問(wèn)多個(gè)變量”的目的。7.2.3 小結(jié)指針p由于引進(jìn)了指針的概念,在程序中要注意區(qū)分下面三種表示方法所具有的不同意義。例如,有一個(gè)指針p,其不同格式代表的意義不同如圖7-13所示。圖7-13 指針p不同格式代表的意義【示例7-4】下面程序接收用戶(hù)輸入的兩個(gè)整數(shù)后,分別輸出p、*p和&p的值,實(shí)現(xiàn)代碼及結(jié)果如圖7-14所示。7.3 指針的算術(shù)運(yùn)算指針變量也有加減運(yùn)算,它可以與某個(gè)整型數(shù)相加減,也可以與指針相減。但指針與指針相加或相乘除都是沒(méi)有意義的。指針的值是一個(gè)內(nèi)存
10、地址,而一個(gè)內(nèi)存地址可以用一個(gè)整型數(shù)表示。因此,指針的算術(shù)運(yùn)算可以看做是整型數(shù)間的一個(gè)運(yùn)算。7.3.1 指針與整數(shù)的加減運(yùn)算指針與整數(shù)的加減運(yùn)算是指將指針作為地址量加上或減去一個(gè)整數(shù)n,其意義及效果如圖7-15所示。圖7-15 指針與整數(shù)的加減運(yùn)算由于指針可以指向不同數(shù)據(jù)類(lèi)型,即數(shù)據(jù)長(zhǎng)度不同的數(shù)據(jù),所以這種運(yùn)算的結(jié)果取決于指針指向的數(shù)據(jù)類(lèi)型。例如一個(gè)int型(4字節(jié)大小)指針加減整型數(shù)的運(yùn)算如圖7-16所示。圖7-16 int型指針加減整數(shù)的運(yùn)算因此,對(duì)于某種數(shù)據(jù)類(lèi)型的指針p來(lái)說(shuō),其實(shí)際操作如圖7-17所示。圖7-17 某種數(shù)據(jù)類(lèi)型的指針p的實(shí)際操作7.3.2 指針加減1運(yùn)算指針與1的加減運(yùn)算
11、是一種特殊的指針與整數(shù)的加減運(yùn)算。由于指針的加減1運(yùn)算在具體程序中使用廣泛,并有自己的表示方法,因此本小結(jié)將單獨(dú)講解。同樣地,指針加減1單項(xiàng)運(yùn)算也是地址計(jì)算,它具有指針與整數(shù)的加減運(yùn)算特點(diǎn),指針的加1、減1單項(xiàng)運(yùn)算是指針中的地址值的變化。在C+中,指針p的加1、減1運(yùn)算表示如圖7-18所示。圖7-18 指針p的加1、減1運(yùn)算表示運(yùn)算后指針地址值的變化量取決于它指向的數(shù)據(jù)類(lèi)型。例如,一個(gè)int型指針p存放的地址為1000,當(dāng)執(zhí)行p+、p后其地址變化如圖7-19所示。圖7-19 執(zhí)行p+、p后其地址變化指針加1、減1單項(xiàng)運(yùn)算與前面所講的自增自減運(yùn)算符類(lèi)似,也分為前置運(yùn)算和后置運(yùn)算,如圖7-20所示
12、。圖7-20 指針加1、減1單項(xiàng)運(yùn)算分類(lèi)當(dāng)指針加1、減1運(yùn)算和其他運(yùn)算出現(xiàn)在一個(gè)表達(dá)式中時(shí),要注意它們之間的結(jié)合規(guī)則和運(yùn)算順序。例如,表達(dá)式y(tǒng)=*p+的分析過(guò)程和運(yùn)算順序如圖7-21所示。圖7-21 表達(dá)式y(tǒng)=*p+的分析過(guò)程和運(yùn)算順序7.3.3 指針的相減運(yùn)算指針的相減運(yùn)算是指兩個(gè)指針?biāo)赶虻淖兞款?lèi)型相同時(shí)可以進(jìn)行減法運(yùn)算。其運(yùn)算結(jié)果是兩個(gè)地址之間可存放的變量個(gè)數(shù),而不是地址量。例如,兩個(gè)int型指針px和py進(jìn)行相減運(yùn)算如圖7-22所示。圖7-22 指針的相減運(yùn)算注意:指針變量也可以進(jìn)行關(guān)系運(yùn)算,用于比較兩個(gè)指針是否相等。指針也可以賦值給相同類(lèi)型的指針變量。7.4 特殊指針前面章節(jié)學(xué)習(xí)了數(shù)
13、組和函數(shù),C+允許指針指向數(shù)組和函數(shù)。本節(jié)將見(jiàn)紹幾種特殊的指針。7.4.1 數(shù)組指針在C+中,數(shù)組指針是一個(gè)指向數(shù)組的指針,其定義的一般形式如圖7-23所示。圖7-23 數(shù)組指針【示例7-7】下列程序定義了一個(gè)數(shù)組指針,并通過(guò)該指針指向某一整型數(shù)組,輸出其中所有數(shù)組元素,其實(shí)現(xiàn)代碼及結(jié)果如圖7-24所示。圖7-24 數(shù)組指針實(shí)例7.4.2 指向函數(shù)的指針函數(shù)指針在C+中,函數(shù)指針是一個(gè)指向函數(shù)的指針,即指針存儲(chǔ)的是函數(shù)的首地址。其定義的一般形式如圖7-25所示。圖7-25 函數(shù)指針在定義了指向函數(shù)的指針變量后,在使用此函數(shù)指針之前,必須先給它賦值,使它指向一個(gè)函數(shù)的入口地址。由于函數(shù)名是函數(shù)在
14、內(nèi)存中的首地址,因此可以將函數(shù)名賦給函數(shù)指針變量,賦值的一般語(yǔ)法格式如圖7-26所示。圖7-26 函數(shù)指針賦值【示例7-8】下面程序定義一個(gè)函數(shù)指針p,該指針指向?qū)崿F(xiàn)兩個(gè)整型值交換的swap()函數(shù)。在使用該函數(shù)指針p前為其賦值,并在main()函數(shù)中調(diào)用了該函數(shù)指針,實(shí)現(xiàn)代碼及結(jié)果如圖7-27所示。圖7-27 函數(shù)指針實(shí)例7.4.3 指針數(shù)組指針數(shù)組就是其元素為指針的數(shù)組,如圖7-28所示。圖7-28 指針數(shù)組指針數(shù)組是指針的集合,其每一個(gè)元素都是指針變量,并且它們具有相同的存儲(chǔ)類(lèi)型和指向相同的數(shù)據(jù)類(lèi)型。指針數(shù)組在使用前必須先聲明,一般地說(shuō),C+中聲明指針數(shù)組的一般形式如圖7-29所示。圖7
15、-29 指針數(shù)組的聲明與普通指針類(lèi)似,指針數(shù)組在使用前也必須先賦值,否則指針可能指向沒(méi)有意義的值。指針數(shù)組賦初值與一般數(shù)組的賦值類(lèi)似,可以在聲明指針數(shù)組的同時(shí)進(jìn)行初始化?!臼纠?-9】下面程序定義了一個(gè)指向字符串的包含5個(gè)元素的指針數(shù)組,初始化后將其倒序輸出,其實(shí)現(xiàn)代碼及結(jié)果如圖7-30所示。圖7-30 指針數(shù)組實(shí)例說(shuō)明:要嚴(yán)格區(qū)分?jǐn)?shù)組指針和指針數(shù)組噢!7.4.4 二級(jí)指針指針的指針雖然指針存儲(chǔ)的是一個(gè)地址,但指針本身也是一個(gè)變量,在內(nèi)存中占據(jù)一定的空間,并且具有一個(gè)地址,這個(gè)地址也可以利用指針來(lái)保存。因此,同樣可以聲明一個(gè)指針來(lái)指向它,這個(gè)指針?lè)Q為指向指針的指針。在C+中,指向指針的指針也被
16、稱(chēng)為二級(jí)指針,在聲明指向指針的指針時(shí),其形式與聲明指針類(lèi)似,但需加上兩個(gè)間接取值的運(yùn)算符“*”,聲明形式如圖7-31所示。圖7-31 二級(jí)指針的聲明與定義【示例7-10】下面程序聲明了一個(gè)指針p,一個(gè)指向指針的指針pp,將指針pp指向指針p,實(shí)現(xiàn)代碼及輸出結(jié)果如圖7-32所示。圖7-32 二級(jí)指針實(shí)例7.4.5 多級(jí)指針二級(jí)以上的指針多級(jí)指針是指含有多個(gè)間接取值運(yùn)算符“*”的指針,其聲明形式與二級(jí)指針類(lèi)似,如圖7-33所示。圖7-33 多級(jí)指針的聲明在C+中常用的是二級(jí)指針,多級(jí)指針只需了解就可以啦!在這不做詳細(xì)講解。7.5 指針的應(yīng)用C+中,使用指針可使程序簡(jiǎn)單、可讀性強(qiáng),并且指針的使用非常
17、靈活。本節(jié)將重點(diǎn)講解指針在數(shù)組、字符串、函數(shù)中的應(yīng)用及動(dòng)態(tài)內(nèi)存分配。7.5.1 指向一維數(shù)組的指針任何數(shù)據(jù)類(lèi)型中的數(shù)組元素,除了用數(shù)組名加下標(biāo)的方法進(jìn)行訪(fǎng)問(wèn)外,還可以用指針訪(fǎng)問(wèn)。用指針訪(fǎng)問(wèn)數(shù)組形式簡(jiǎn)單、使用靈活,程序的可讀性強(qiáng)。1指針訪(fǎng)問(wèn)數(shù)組元素用指針指向數(shù)組就是讓指針指向這段連續(xù)內(nèi)存的首地址,即數(shù)組中第一個(gè)元素(下標(biāo)為0)的地址。定義一個(gè)指向數(shù)組的指針變量,只要其與數(shù)組元素類(lèi)型相同即可。由于數(shù)組是一段連續(xù)的內(nèi)存,指針可以指向數(shù)組,而且可以通過(guò)加、減整數(shù)來(lái)移動(dòng)指針。所以,可以通過(guò)指針來(lái)訪(fǎng)問(wèn)數(shù)組,即數(shù)組中的元素。使用指針訪(fǎng)問(wèn)數(shù)組,同用下標(biāo)訪(fǎng)問(wèn)數(shù)組的效果是一樣的。例如一個(gè)指向數(shù)組arr首地址的指針
18、p,訪(fǎng)問(wèn)第i+1個(gè)元素(下標(biāo)為i),可以用*(p+i),也可以用arri,這兩種方法是等價(jià)的。由于數(shù)組名代表的是數(shù)組的首地址,所以也可以用*(arr +i)來(lái)訪(fǎng)問(wèn)第i+1個(gè)元素,如圖7-34所示。圖7-34 指針訪(fǎng)問(wèn)數(shù)組元素【示例7-11】下面程序通過(guò)幾種方式對(duì)數(shù)組元素進(jìn)行訪(fǎng)問(wèn),實(shí)現(xiàn)代碼及結(jié)果如圖7-35所示。圖7-35 幾種方式對(duì)數(shù)組元素進(jìn)行訪(fǎng)問(wèn)無(wú)論是采用下標(biāo)、地址還是指針都可以得到相同的訪(fǎng)問(wèn)結(jié)果。但是,在數(shù)組元素的訪(fǎng)問(wèn)中,使用指針進(jìn)行訪(fǎng)問(wèn)更為靈活。2指向一維數(shù)組在實(shí)際程序中一維數(shù)組的使用最為頻繁,因此使用指針指向一維數(shù)組是具體應(yīng)用中使用最多的?!臼纠?-12】下面程序?qū)⒁粋€(gè)數(shù)組的元素進(jìn)行反
19、轉(zhuǎn),即第一個(gè)元素放到最后一個(gè),第二個(gè)元素放到倒數(shù)第二個(gè),依此類(lèi)推,其實(shí)現(xiàn)代碼及結(jié)果如圖7-36所示。圖7-36 指向一維數(shù)組的實(shí)例注意:在使用指針訪(fǎng)問(wèn)數(shù)組時(shí)不要越界,即保證指針指向數(shù)組第一個(gè)到最后一個(gè)元素。7.5.2 指向二維數(shù)組的指針多維數(shù)組尤其是二維數(shù)組在具體程序中的應(yīng)用非常廣泛,通過(guò)指針來(lái)訪(fǎng)問(wèn)二維數(shù)組元素也是常用的。對(duì)于一維數(shù)組array10而言,指針指向?yàn)閿?shù)組的首地址,即&array0的值。而對(duì)于二維數(shù)組array1010而言,數(shù)組的首地址為&array00的值。因此,對(duì)于二維數(shù)組中的元素arrayij有多種訪(fǎng)問(wèn)方法如圖7-37所示。圖7-37 二維數(shù)組中的元素arrayij的訪(fǎng)問(wèn)方法
20、例如,一個(gè)數(shù)組a35中元素a23的三種等價(jià)訪(fǎng)問(wèn)方法如圖7-38所示。圖7-38 元素a23的三種等價(jià)訪(fǎng)問(wèn)方法在二維數(shù)組a35中,其是一個(gè)3*5的矩陣,包括三行,每一行都有起始地址。C+中以a0、a1、a2分別表示第0行、第1行、第2行的起始地址,即該行第0列元素的地址。注意:二維數(shù)組的a0、a 1、a2并不是一個(gè)元素,而是一行首地址,正如同一維數(shù)組名是數(shù)組起始地址一樣。因此,a0的值等于&a00,a1的值等于&a10,a2的值等于&a20?!臼纠?-13】下面程序指向二維數(shù)組array首元素的指針p,通過(guò)幾種指針訪(fǎng)問(wèn)元素的方式將數(shù)組中的元素依次輸出,其實(shí)現(xiàn)代碼及結(jié)果如圖7-39所示。圖7-39
21、 指向二維數(shù)組指針實(shí)例7.5.3 指向字符串的指針在C+中,字符串是用字符數(shù)組表示和存儲(chǔ)的。數(shù)組的訪(fǎng)問(wèn)能夠通過(guò)指針來(lái)實(shí)現(xiàn),因此字符串也同樣可以通過(guò)指針來(lái)訪(fǎng)問(wèn)。指向字符串的指針就是一個(gè)char類(lèi)型的指針。與普通指針一樣,字符串指針在使用前也必須先定義。例如,下面語(yǔ)句定義了一個(gè)字符串str,并定義了一個(gè)指向該字符串的指針p,并為該指針進(jìn)行初始化。如圖7-40所示。圖7-40 指向字符串的指針【示例7-14】下面示例用字符串指針訪(fǎng)問(wèn)字符串,并使用字符串函數(shù)對(duì)字符串進(jìn)行比較和計(jì)算長(zhǎng)度操作,實(shí)現(xiàn)代碼及結(jié)果如圖7-41所示。圖7-41 指向字符串指針實(shí)例7.5.4 指針作為函數(shù)參數(shù)在函數(shù)的參數(shù)列表中,可以
22、使用指針類(lèi)型的參數(shù)。傳遞給指針參數(shù)的實(shí)參可以是一個(gè)指針變量,也可以是一個(gè)變量的地址。在C+中,使用指針作為參數(shù)可以提高傳遞參數(shù)的效率,而且在函數(shù)中可以修改實(shí)參指針?biāo)缸兞康闹?。例如,下面聲明函?shù)function()時(shí)其形式參數(shù)就是一個(gè)int類(lèi)型的指針,在調(diào)用函數(shù)function()時(shí)必須傳入一個(gè)int型的指針變量,如圖7-42所示。圖7-42 指針作為函數(shù)參數(shù)注意:使用指針作為函數(shù)的形式參數(shù),在調(diào)用該參數(shù)時(shí)傳遞的是地址?!臼纠?-15】下面程序?qū)⒅羔樧鳛楹瘮?shù)的參數(shù)進(jìn)行傳遞,完成兩個(gè)數(shù)之間的互相交換功能,使用的是地址傳遞的方式,其實(shí)現(xiàn)代碼及結(jié)果如圖7-43所示。圖7-43 指針作為函數(shù)參數(shù)實(shí)例代
23、碼“change(&x,&y);”中的change()函數(shù)成功地實(shí)現(xiàn)了x和y之間的數(shù)據(jù)交換,函數(shù)的形參是兩個(gè)int型指針,將調(diào)用函數(shù)中的變量地址作為實(shí)參,賦值給形參,完成對(duì)調(diào)用函數(shù)中變量的處理。7.5.5 指針作為函數(shù)的返回值指針函數(shù)指針函數(shù)是指函數(shù)的返回值為指針類(lèi)型。指針函數(shù)在調(diào)用后返回一個(gè)指針,通過(guò)指針中存儲(chǔ)的地址值,主調(diào)函數(shù)就能訪(fǎng)問(wèn)該地址中存放的數(shù)據(jù),并通過(guò)指針?biāo)阈g(shù)運(yùn)算訪(fǎng)問(wèn)這個(gè)地址的前、后內(nèi)存中的值。指針函數(shù)與一般函數(shù)的區(qū)別如圖7-44所示。圖7-44 指針函數(shù)與一般函數(shù)的區(qū)別在C+中,指針函數(shù)與一般函數(shù)的聲明和定義形式類(lèi)似,不同點(diǎn)在于其返回值必須為指針,其一般語(yǔ)法形式如圖7-45所示。
24、圖7-45 指針函數(shù)的聲明在具體程序中,指針函數(shù)的優(yōu)勢(shì)在于其能夠返回一組數(shù)據(jù),因此指針函數(shù)多用于數(shù)組和字符串的處理?!臼纠?-16】下面程序定義了一個(gè)包含5個(gè)字符串的指針數(shù)組,將這些字符串進(jìn)行比較后輸出其中最大的一個(gè),其實(shí)現(xiàn)代碼及結(jié)果如圖7-46所示。圖7-46 指針函數(shù)實(shí)例注意:函數(shù)指針與指針函數(shù)不要混淆噢!7.5.6 動(dòng)態(tài)內(nèi)存分配指針存儲(chǔ)的是內(nèi)存地址,在使用指針的時(shí)候,需要保證指向地址的有效性。C+程序中的內(nèi)存分配分為兩種,如圖7-47所示。圖7-47 C+程序中的內(nèi)存分配在C+中,通過(guò)關(guān)鍵字new和delete來(lái)實(shí)現(xiàn)程序的動(dòng)態(tài)內(nèi)存分配和回收,如圖7-48所示。圖7-48 動(dòng)態(tài)內(nèi)存分配和回
25、收其中,關(guān)鍵字new實(shí)現(xiàn)內(nèi)存分配,如果需要對(duì)分配出的內(nèi)存進(jìn)行初始化,則在類(lèi)型后面加上一個(gè)括號(hào),并帶有初始值。因此,C+中動(dòng)態(tài)分配內(nèi)存的一般形式如圖7-49所示。圖7-49 C+中動(dòng)態(tài)分配內(nèi)存的一般形式此外,通過(guò)關(guān)鍵字new分配的內(nèi)存必須由開(kāi)發(fā)者自己去釋放。一塊內(nèi)存如果沒(méi)有被釋放,則可以一直存在到該應(yīng)用程序結(jié)束。在C+中,使用delete來(lái)釋放內(nèi)存,其一般形式如圖7-50所示。圖7-50 delete釋放內(nèi)存的一般形式【示例7-17】下面程序?yàn)橐粋€(gè)整數(shù)和一個(gè)整型數(shù)組動(dòng)態(tài)分配內(nèi)存空間,使用該空間存儲(chǔ)用戶(hù)輸入的數(shù)組元素,最后將這些空間釋放,實(shí)現(xiàn)代碼及結(jié)果如圖7-51所示。圖7-51 動(dòng)態(tài)內(nèi)存分配實(shí)例
26、用new申請(qǐng)動(dòng)態(tài)數(shù)組,格式如下:類(lèi)型名 *指針變量名= new 類(lèi)型名元素個(gè)數(shù);其中,元素個(gè)數(shù)可以是變量。7.6 引用雖然指針的使用非常靈活和高效,但使用起來(lái)卻不是非常方便。如果使用不當(dāng),很容易導(dǎo)致某些不易察覺(jué)的錯(cuò)誤。為此,C+引入了引用。7.6.1 引用的應(yīng)用在C+中,引用也是一種數(shù)據(jù)類(lèi)型。引用不能獨(dú)立存在,而只能依附于一個(gè)變量。所以定義一個(gè)引用必須指明是哪個(gè)變量的引用。定義一個(gè)引用包括目標(biāo)變量的數(shù)據(jù)類(lèi)型、引用修飾符“&”、引用的標(biāo)識(shí)符及目標(biāo)變量的標(biāo)識(shí)符。其語(yǔ)法如圖7-52所示。圖7-52 引用的一般語(yǔ)法形式注意:此處的“&”不是取地址運(yùn)算符,而是一個(gè)引用修飾符。引用一旦定義,則始終跟其目標(biāo)變量綁定,而不能改變?yōu)槠渌兞康囊?。假如b是變量a的引用,則在b的生命周期內(nèi),b始終都是a的引用,而不能再改變?yōu)槠渌兞康囊?。此外,?duì)于引用在其生命周期內(nèi)完全可以替代其目標(biāo)變量。也就是說(shuō),所有施加于引用上的操作,其效果等同于直接對(duì)引用的目標(biāo)變量操作。而且一旦目標(biāo)變量的值發(fā)生了改變,引用的值也會(huì)發(fā)生同樣的改變。如圖7-53所示的程序體現(xiàn)了引用的這個(gè)特征。圖7-53 引用的特征鑒于引用的不可變更性,以及引用與目標(biāo)變量的等價(jià)性,一個(gè)變量的引用也可以看做是該變量的別名。定義一個(gè)引用只不過(guò)是給變量另外命名。這樣兩個(gè)名字擁有一個(gè)實(shí)體,對(duì)一個(gè)名字的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中語(yǔ)文第7單元11玄黑結(jié)婚作業(yè)含解析新人教版選修中國(guó)小說(shuō)欣賞
- 2025屆高考英語(yǔ)二輪復(fù)習(xí)專(zhuān)項(xiàng)解密01冠詞含解析
- 合肥保時(shí)捷購(gòu)買(mǎi)合同范例
- 樂(lè)山勞務(wù)派遣合同范例
- 小區(qū)購(gòu)新房合同范例
- 廣告制作包吃住合同范例
- 學(xué)校煤炭供應(yīng)合同范例
- 雙方共同投資合同范例
- 2024年重慶客運(yùn)考題
- 2024年河北客運(yùn)資格證應(yīng)用能力試題
- 電氣工程及其自動(dòng)化生涯發(fā)展展示
- 2024學(xué)校所屬企業(yè)國(guó)有資產(chǎn)管理的若干意見(jiàn)全文
- 五年級(jí)上冊(cè)簡(jiǎn)易方程練習(xí)400題及答案
- 員工安全出行知識(shí)培訓(xùn)
- 大數(shù)據(jù)與會(huì)計(jì)職業(yè)生涯規(guī)劃
- 眼科護(hù)理中的圍手術(shù)期護(hù)理與管理
- 高三英語(yǔ)一輪復(fù)習(xí)七選五深度剖析課件
- 二次結(jié)構(gòu)施工培訓(xùn)
- 中華民族的形成與發(fā)展(原版)
- 樂(lè)器租賃市場(chǎng)需求與增長(zhǎng)潛力
- 視覺(jué)傳達(dá)專(zhuān)業(yè)大學(xué)生職業(yè)規(guī)劃
評(píng)論
0/150
提交評(píng)論