高級(jí)語(yǔ)言程序設(shè)計(jì)-從C到C++(第二版)課件:指針_第1頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì)-從C到C++(第二版)課件:指針_第2頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì)-從C到C++(第二版)課件:指針_第3頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì)-從C到C++(第二版)課件:指針_第4頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì)-從C到C++(第二版)課件:指針_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

7.1指針的概念7.2指針變量7.3指針與一維數(shù)組7.4指針與多維數(shù)組7.5指針與字符串7.1指針的概念程序中的每條指令或數(shù)據(jù)都需要存放在計(jì)算機(jī)的存儲(chǔ)器中,在編譯或運(yùn)行程序的過(guò)程中為它們分配內(nèi)存單元。內(nèi)存單元以字節(jié)為單位,每一個(gè)字節(jié)對(duì)應(yīng)一個(gè)地址。對(duì)象(如變量、數(shù)組、函數(shù)等)的地址是指該對(duì)象所占存儲(chǔ)單元的首個(gè)字節(jié)的編號(hào),而對(duì)象名作為一個(gè)標(biāo)識(shí)符,是用來(lái)標(biāo)注該對(duì)象的。標(biāo)識(shí)符的使用是為了方便程序的編寫(xiě)。系統(tǒng)在引用對(duì)象時(shí),是通過(guò)地址找到該對(duì)象,再根據(jù)對(duì)象的類型在相應(yīng)長(zhǎng)度的存儲(chǔ)單元中存取數(shù)據(jù)。由于通過(guò)地址可以找到相應(yīng)的對(duì)象,即地址指向該對(duì)象,因此地址也被稱為“指針”。換句話說(shuō),指針就是地址。對(duì)象的指針就是該對(duì)象所在存儲(chǔ)單元的首字節(jié)地址。7.2指針變量指針變量是專門(mén)用來(lái)存放地址的變量。通過(guò)指針變量來(lái)存放某一特定變量的地址,可以建立指針變量與其指向變量之間的關(guān)聯(lián)。為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中使用指針運(yùn)算符“*”表示“指向”。變量名與變量的地址之間存在映射關(guān)系。在程序設(shè)計(jì)過(guò)程中,為了方便對(duì)變量的引用而使用變量名;在程序運(yùn)行過(guò)程中,系統(tǒng)對(duì)變量的訪問(wèn)使用的是地址;程序經(jīng)過(guò)編譯后,變量名會(huì)轉(zhuǎn)換為變量的地址。通過(guò)變量名訪問(wèn)變量的方式稱為“直接訪問(wèn)”。之前我們一直都是使用“直接訪問(wèn)”的方式引用變量的。指針變量可以用來(lái)存放某一特定變量的地址。通過(guò)指針變量獲取地址從而訪問(wèn)該地址所對(duì)應(yīng)的變量,稱為“間接訪問(wèn)”,如圖7-1所示。圖中的箭頭表示“指向”關(guān)系。int型變量a的值為5,a的地址為2000;現(xiàn)定義指向int型變量的指針變量p,用于存放int型變量a的地址,即p=&a,值為2000;而*p就表示指針變量p所指向的int型變量a,即*p=a。在通過(guò)指針實(shí)現(xiàn)對(duì)變量的間接訪問(wèn)時(shí),系統(tǒng)首先根據(jù)存放于變量p中的地址2000,找到變量a所在存儲(chǔ)單元的起始位置,并根據(jù)int型數(shù)據(jù)所占空間大小,將從地址2000開(kāi)始到2003結(jié)束的4個(gè)字節(jié)存儲(chǔ)單元中的數(shù)據(jù)取出,即整數(shù)5。通過(guò)“間接訪問(wèn)”的方式引用變量,可以大大提高程序的執(zhí)行效率并使程序更加簡(jiǎn)潔。在深入介紹指針之前,我們先理順以下幾個(gè)概念:(1)地址:內(nèi)存中存儲(chǔ)單元的編號(hào)。

(2)變量:內(nèi)存中某個(gè)特定的存儲(chǔ)單元。(3)變量的地址:某一變量所在的存儲(chǔ)單元的地址編號(hào)。

(4)變量的名稱:為該存儲(chǔ)單元所定義的名稱,便于程序設(shè)計(jì)。(5)變量的值:存放在特定存儲(chǔ)單元中的數(shù)據(jù)。(6)指針:地址。(7)變量的指針:變量的地址。(8)指針變量:存放地址的變量。(9)指向變量的指針變量:存放某個(gè)特定變量地址的指針變量,通過(guò)該指針變量可以指向特定的變量。7.2.1指針變量的定義指針變量是專門(mén)用來(lái)存放地址的變量,變量的類型為“指針”類型。定義指針變量的基本格式為“指針變量名”是定義的指針變量的標(biāo)識(shí)符?!?”是類型符,與“char”、“int”、“float”的作用相同,表示定義的變量為指針類型?!邦愋汀庇糜诼暶鞫x的指針變量所指向的變量的類型。7.2.2指針變量的賦值定義指針變量后,如果沒(méi)有對(duì)其賦值,那么該指針變量的值是不確定的,即不能確定指針變量中當(dāng)前存放的是哪個(gè)內(nèi)存單元的地址。此時(shí)如果盲目訪問(wèn),可能會(huì)破壞內(nèi)存中原有的重要數(shù)據(jù)或程序代碼。因此,對(duì)于指針變量,應(yīng)該先賦值、再引用。使用指針變量存放內(nèi)存中任意一個(gè)地址是沒(méi)有意義并且危險(xiǎn)的。雖然地址是以整數(shù)形式表示的,但不要將一個(gè)整數(shù)賦值給指針變量,因?yàn)椴⒉磺宄撜麛?shù)表示的地址中存放的是什么數(shù)據(jù)。正確的方法是用一個(gè)已知存在的變量地址為指針變量賦值。7.2.3指針變量的引用C語(yǔ)言標(biāo)準(zhǔn)提供了兩種運(yùn)算符來(lái)引用指針:(1)“&”,取地址運(yùn)算符,如“&a”為變量a的地址。(2)“*”,指針運(yùn)算符,如“*p”為指針變量p所指向的變量。7.2.4指針變量的運(yùn)算指針變量的算術(shù)運(yùn)算其實(shí)就是地址的算術(shù)運(yùn)算。C語(yǔ)言允許指針與一個(gè)整數(shù)進(jìn)行加減運(yùn)算,以實(shí)現(xiàn)移動(dòng)指針的目的。以“inta=1,*p=&a;(設(shè)a的地址為2004)”為例,通過(guò)之前的學(xué)習(xí),我們已經(jīng)知道:指針變量p存儲(chǔ)的是變量a的地址,即p=&a,值為2004。*p表示指針變量p所指向的變量a,即?*p=a,值為1。(1)“&”和“*”同為單目運(yùn)算符,優(yōu)先級(jí)相同,結(jié)合性自右向左,所以,&*p表示指針p所指向的變量的地址,即&*p=&(*p)=&a,值為2004。而?*&a表示變量a的地址所指向的變量,即?*&a=*(&a)=*p,值為1。(2)指針變量可以作自增自減運(yùn)算,++p或p++,表示p的值加1。由于p存放的是地址,所以此處的加“1”表示移動(dòng)一個(gè)基類型的數(shù)據(jù)長(zhǎng)度單位;由于變量p的基類型是int類型,數(shù)據(jù)長(zhǎng)度單位為4個(gè)字節(jié),所以當(dāng)?++p或p++?作為一個(gè)獨(dú)立、完整的表達(dá)式時(shí),其存儲(chǔ)的地址均更新為2004?+?4?=?2008。(3)指針?biāo)赶虻淖兞孔髯栽鲎詼p運(yùn)算,--(*p)?或?(*p)--,表示指針p所指向的變量的值減1,由于變量a的值為1,所以,當(dāng)?--(*p)或(*p)--?作為一個(gè)獨(dú)立、完整的表達(dá)式時(shí),其指向的變量a的值均為1-1?=?0。(4)自增自減運(yùn)算符“++”、“--”和“*”同為單目運(yùn)算符,優(yōu)先級(jí)相同,結(jié)合性都是自右向左,所以在兩種運(yùn)算符同時(shí)使用的場(chǎng)合,為避免混淆,應(yīng)使用括號(hào)進(jìn)行區(qū)分。(5)針對(duì)指針變量的加減運(yùn)算,應(yīng)確認(rèn)在運(yùn)算后該指針變量的指向關(guān)系,避免運(yùn)算后指向未知的內(nèi)存空間。7.2.5使用指針變量作函數(shù)參數(shù)使用基本類型變量作函數(shù)參數(shù)是“單向的值傳遞”,形參的值在被調(diào)函數(shù)中發(fā)生改變,不會(huì)影響到主調(diào)函數(shù)中的實(shí)參。并且,當(dāng)主調(diào)函數(shù)需要獲取被調(diào)函數(shù)的運(yùn)行結(jié)果時(shí),必須使用return語(yǔ)句,而每調(diào)用一次被調(diào)函數(shù),只能執(zhí)行一條return語(yǔ)句,并且每條return語(yǔ)句只能返回一個(gè)值。使用指向變量的指針作函數(shù)實(shí)參,將主調(diào)函數(shù)中實(shí)參的地址傳遞給形參,則形參與實(shí)參共用該實(shí)參變量所指向的內(nèi)存空間。在被調(diào)函數(shù)中改變形參所指向的變量的值,實(shí)際上就是改變主調(diào)函數(shù)中實(shí)參變量所指向的變量的值。所以,從這個(gè)角度來(lái)看,“指針傳遞”帶來(lái)的影響是“雙向的”。同時(shí),可以看出,主調(diào)函數(shù)中變量值的改變,并不需要通過(guò)執(zhí)行return語(yǔ)句來(lái)實(shí)現(xiàn)。這種方式,又叫做地址傳遞(傳地址)或者引用傳遞(傳引用)。主函數(shù)在調(diào)用square函數(shù)時(shí),將實(shí)參的地址傳遞給square函數(shù)的形參,建立了形參到實(shí)參的指向關(guān)系,可以認(rèn)為該指向關(guān)系的建立是通過(guò)“int*n=&inumber;”形式實(shí)現(xiàn)的。square函數(shù)中對(duì)指針變量n所做的處理由于指向關(guān)系的存在,實(shí)際修改的是主函數(shù)中變量inumber的值。square函數(shù)調(diào)用結(jié)束后,形參到實(shí)參的指向關(guān)系結(jié)束。7.3指針與一維數(shù)組指針既然可以指向變量,當(dāng)然也可以指向數(shù)組元素。數(shù)組是同類型數(shù)據(jù)的有序集合,數(shù)組名就是數(shù)組的首元素的地址。通過(guò)對(duì)指向數(shù)組元素的指針做加減運(yùn)算,可以很方便地獲取數(shù)組中任意一個(gè)元素的地址。指針做加減運(yùn)算的特點(diǎn),使得指針特別適合處理像數(shù)組這樣存儲(chǔ)在連續(xù)內(nèi)存空間中的數(shù)據(jù)。對(duì)數(shù)組元素的引用,可以使用下標(biāo)來(lái)實(shí)現(xiàn),也可以借助指針來(lái)實(shí)現(xiàn),即通過(guò)指向數(shù)組元素的指針找到需要引用的元素。使用指針訪問(wèn)數(shù)組元素,能使目標(biāo)程序所占內(nèi)存更少,運(yùn)行速度更快。7.3.1指向數(shù)組元素的指針為了實(shí)現(xiàn)借助指針引用數(shù)組元素,通常將數(shù)組的首元素的地址賦值給與數(shù)組類型相同的指針變量,建立指針變量到該數(shù)組首元素的指向關(guān)系,并通過(guò)執(zhí)行指針的加減運(yùn)算,將指針指向數(shù)組中的各個(gè)元素,其關(guān)系如圖7-2所示。 將數(shù)組名賦值給指針變量:將數(shù)組首個(gè)元素的地址賦值給指針變量:以圖7-2為例,當(dāng)指針p指向數(shù)組a的首字節(jié)地址時(shí),則建立如下的等價(jià)關(guān)系:同樣以圖7-2為例,若指針p指向數(shù)組a的第i個(gè)元素,則得到如下的等價(jià)關(guān)系:其中,指針變量結(jié)合自增或自減運(yùn)算符,可以使指針自動(dòng)向后或向前移動(dòng),直接指向下一個(gè)或上一個(gè)數(shù)組元素,而不必每次都重新計(jì)算地址。這種有規(guī)律地改變地址值的做法可以大大提高程序的執(zhí)行效率。但是需要注意對(duì)數(shù)組元素的引用不能越界。在引用數(shù)組元素時(shí),可以使用兩種方法:下標(biāo)法和指針?lè)ā?.3.2指向數(shù)組元素的指針作函數(shù)參數(shù)將指向數(shù)組元素的指針作為實(shí)參傳遞給被調(diào)函數(shù)的形參,可以在被調(diào)函數(shù)中通過(guò)形參指針直接改變主調(diào)函數(shù)中的數(shù)組元素。實(shí)參可以是數(shù)組名,也可以是指向數(shù)組元素的指針變量;形參需要接收數(shù)組元素的地址,所以必須是指針變量且其類型與數(shù)組的類型一致?!纠?.8】通過(guò)指針傳遞,在被調(diào)函數(shù)中將數(shù)組元素的值翻倍。運(yùn)行結(jié)果:在main函數(shù)中定義指針變量pm,并使用數(shù)組a的地址對(duì)指針變量pm進(jìn)行了初始化,建立指針pm到數(shù)組a的首元素的指向關(guān)系。對(duì)數(shù)組元素的存取采用了指針?lè)绞?,即?(pm++)”,當(dāng)然也可以采用下標(biāo)法“a[i]”,或者“*(a+i)”和“*(pm+i)”的指針形式,但不能寫(xiě)成“*(a++)”的形式,因?yàn)閍是指針常量。在調(diào)用change函數(shù)前,以“*(pm++)”方式通過(guò)循環(huán)結(jié)構(gòu)逐一輸出數(shù)組元素,在結(jié)束循環(huán)之后,指針pm已經(jīng)越過(guò)了數(shù)組的界限而指向其后的4字節(jié)存儲(chǔ)單元;此時(shí)應(yīng)將pm重新賦值為數(shù)組a的首元素地址,讓指針pm再次指向數(shù)組a,以保證在此之后,使用指針傳遞正確的地址。在調(diào)用change函數(shù)時(shí),將元素個(gè)數(shù)和數(shù)組地址分別傳遞給了change函數(shù)的形參變量n和形參指針pc,表達(dá)式“change(4,pm)”可以改寫(xiě)為“change(4,a)”、“change(4,&a[0])”。在change函數(shù)中執(zhí)行循環(huán)語(yǔ)句,先將指針pc所指向的變量的值更新為原值的2倍,再通過(guò)pc的自增,將指針指向下一個(gè)元素。表達(dá)式“*pc++”表示先引用指針pc所指向的變量,再對(duì)pc(地址)的值自增,而不是直接對(duì)?*pc(指向的變量)的值自增。在change函數(shù)中并沒(méi)有通過(guò)return語(yǔ)句向main函數(shù)返回?cái)?shù)據(jù),但由于在函數(shù)調(diào)用時(shí),傳遞的是數(shù)組地址,因此在change函數(shù)中通過(guò)改變形參指針直接影響了main函數(shù)中的數(shù)組元素。7.4指針與多維數(shù)組多維數(shù)組也是同一類型數(shù)據(jù)的有序集合,其存儲(chǔ)形式與一維數(shù)組的存儲(chǔ)形式相同,即所有元素按順序占用一段連續(xù)的內(nèi)存空間。通過(guò)前面的介紹,我們已掌握通過(guò)指針引用一維數(shù)組元素的方法。本節(jié)以二維數(shù)組為例,介紹通過(guò)指針引用多維數(shù)組元素的方法。7.4.1通過(guò)指針引用二維數(shù)組元素通過(guò)對(duì)指向數(shù)組元素的指針做加減運(yùn)算,可以很方便地存取一維數(shù)組中任意一個(gè)元素。二維數(shù)組的存儲(chǔ)形式與一維數(shù)組的存儲(chǔ)形式相同,也是將所有的元素按順序存放在一段連續(xù)的內(nèi)存空間中,所以也可以建立指針與二維數(shù)組的關(guān)系,以便引用二維數(shù)組元素?!纠?.11】使用指針引用二維數(shù)組元素。運(yùn)行結(jié)果:程序中定義了一個(gè)類型為int型的指針變量p,并使用數(shù)組名a初始化,建立指針p到二維數(shù)組的指向關(guān)系。由于二維數(shù)組在內(nèi)存中的存儲(chǔ)是行優(yōu)先,即按行的順序連續(xù)存儲(chǔ),“inta[3][4]”表示二維數(shù)組a有3行,每行有4個(gè)元素,共有12(3行?×?4列)個(gè)元素。程序中以變量i表示元素的行下標(biāo)、變量j表示元素的列下標(biāo),則有表達(dá)式“(p+i*4+j)”表示在二維數(shù)組第i行上的第j個(gè)元素的地址,輸出參數(shù)“*(p+i*4+j)”即表示該地址所指向的元素。在循環(huán)語(yǔ)句的控制下,指針p從指向二維數(shù)組a的首個(gè)元素開(kāi)始,按照存儲(chǔ)順序,逐一指向數(shù)組中的各個(gè)元素。當(dāng)然如果把二維數(shù)組當(dāng)作一維數(shù)組來(lái)處理,程序中的循環(huán)語(yǔ)句也可以改為7.4.2指向數(shù)組的指針嚴(yán)格來(lái)說(shuō),C語(yǔ)言并沒(méi)有“多維數(shù)組”這一概念,程序設(shè)計(jì)人員所說(shuō)的“多維數(shù)組”,C語(yǔ)言將其描述為“數(shù)組的數(shù)組”。因此,對(duì)于多維數(shù)組,C語(yǔ)言并不像處理一維數(shù)組那樣,簡(jiǎn)單地將其轉(zhuǎn)換為指向同類型變量的指針,而是將其轉(zhuǎn)換為指向同類型數(shù)組的指針。數(shù)組是一個(gè)可以遞歸的概念:任何維數(shù)的數(shù)組都可以看作由比它少一維的數(shù)組作為元素組成的“一維”數(shù)組。C語(yǔ)言總是將多維數(shù)組轉(zhuǎn)換成一維數(shù)組來(lái)處理的,如果該一維數(shù)組的元素又是一個(gè)一維數(shù)組或多維數(shù)組,則根據(jù)遞歸定義,再次轉(zhuǎn)換,直到轉(zhuǎn)換后的一維數(shù)組元素為基本類型變量為止。這就是C語(yǔ)言描述的“數(shù)組的數(shù)組”的含義。C語(yǔ)言在處理一維數(shù)組時(shí),將其轉(zhuǎn)換為指向同類型變量的指針。在處理多維數(shù)組時(shí),將其轉(zhuǎn)換為指向同類型數(shù)組的指針。7.4.3指向數(shù)組的指針作函數(shù)參數(shù)只要能保證引用表達(dá)式的正確,無(wú)論是通過(guò)指向數(shù)組元素的指針還是通過(guò)指向數(shù)組的指針,都可以引用二維數(shù)組元素。然而,使用指向數(shù)組的指針引用二維數(shù)組元素,能夠更加便捷地訪問(wèn)二維數(shù)組中特定一行的數(shù)據(jù),并且在語(yǔ)義上更能體現(xiàn)程序設(shè)計(jì)的思想。7.5指針與字符串類型為char型的指針變量,也稱為字符指針。字符指針可以指向一個(gè)字符變量,也可以指向一個(gè)字符數(shù)組。C語(yǔ)言沒(méi)有字符串?dāng)?shù)據(jù)類型,而是將字符串作為字符數(shù)組來(lái)處理,以“\0”作為字符串的結(jié)束標(biāo)記。對(duì)于通過(guò)指針引用字符和字符數(shù)組,與前面的內(nèi)容并無(wú)區(qū)別。7.5.1字符串的引用形式在引用一個(gè)字符串時(shí),可以采用以下兩種方式:(1)定義一個(gè)字符數(shù)組,將字符串存入該數(shù)組。使用字符串常量初始化字符數(shù)組,從數(shù)組的首地址開(kāi)始,依次將字符串中的字符逐一寫(xiě)入存儲(chǔ)單元,并自動(dòng)存入一個(gè)“\0”作為結(jié)束符。對(duì)于該字符串的引用,可以采用數(shù)組的下標(biāo),也可以使用%s控制符讀取。(2)定義一個(gè)字符指針,建立對(duì)字符串常量的指向關(guān)系。通過(guò)定義一個(gè)字符指針并以字符串常量對(duì)該指針進(jìn)行初始化,建立了指向關(guān)系。這個(gè)指向關(guān)系的建立,是通過(guò)把字符串的首元素賦值給了類型為char型的指針變量string來(lái)實(shí)現(xiàn)的,因此可以通過(guò)該指針變量逐一存取字符串,當(dāng)然也可以通過(guò)%s控制符讀取。7.5.2指向字符串的指針在使用字符指針引用字符串時(shí),需注意以下幾個(gè)問(wèn)題:(1)字符指針對(duì)字符串的引用。定義字符指針時(shí)可以使用字符串進(jìn)行初始化;定義字符指針后,使用字符串首字符的地址為字符指針賦值,從而建立指向關(guān)系。在指向關(guān)系的建立過(guò)程中,系統(tǒng)并不是用字符串“hello

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論