C高級語言程序設(shè)計第六篇_第1頁
C高級語言程序設(shè)計第六篇_第2頁
C高級語言程序設(shè)計第六篇_第3頁
C高級語言程序設(shè)計第六篇_第4頁
C高級語言程序設(shè)計第六篇_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2018/9/20,1,C,高級語言程序設(shè)計,第,6,章,指針和引用,北京郵電大學,信息與通信工程學院,北京郵電大學信息與通信工程學院,指針,Pointer,是,C,和,C,的一,種數(shù)據(jù)類型。很多其他高級語言,也有類似的數(shù)據(jù)類型。引用,Reference,則是,C,所特有的,一種數(shù)據(jù)類型。指針和引用在概,念上和使用上都有相似之處,但,是也有重要的差別,2018/9/20,2,北京郵電大學信息與通信工程學院,第六章,指針和引用,6.1,指針的概念,6.2,指針的運算,6.3,指針訪問動態(tài)內(nèi)存,6.4,指向結(jié)構(gòu)體的指針,6.5,引用概念,6.6,指針和引用作為函數(shù)的參數(shù),6.7,指針和引用作為函數(shù)

2、的返回值,6.8,指針和字符串,6.9,通過指針訪問數(shù)組,2018/9/20,3,北京郵電大學信息與通信工程學院,6.1,指針的概念,2018/9/20,4,北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,5,6.1.1,指針和指針變量,指針是變量的地址?;蛘哒f是在內(nèi)存中,存放,某種類型變量的地址,例如,定義了整型變量,a,a,的地址就是一個指,針,也可以不定義任何變量,只是指定內(nèi)存某個地,址開始(如,0 x00430100,的,4,個字節(jié)存放整,型變量,這樣的地址也是指針,存放指針的變量就是指針變量,2018/9/20,北京郵電大學信息與通信工程學院,6,

3、6.1.1,指針和指針變量,當聲明了一個指針變量后,確定了三件事,變量本身在內(nèi)存中所分配的地址和字節(jié)數(shù),指針變,量總是占有,4,個字節(jié),系統(tǒng)允許的地址范圍,以及地址單元內(nèi)可以存放的,內(nèi)容,指針變量可以進行的運算,訪問指針變量時,只能看到地址。只有通過這,個地址,才能訪問地址單元中的內(nèi)容。這樣的,訪問稱為對于內(nèi)存單元的,間接訪問,2018/9/20,北京郵電大學信息與通信工程學院,7,6.1.2,指針變量的聲明和初始化,指針變量聲明的格式是,類型名,變量名,1,變量名,2,例如,int *va1, *va2,char *ch1, *ch2,指針變量在聲明后,變量的值(地址)是隨機,的,這樣的指針

4、變量是不能安全的使用的,因,為其中的隨機地址完全可能不是有效的數(shù)據(jù)地,址,2018/9/20,北京郵電大學信息與通信工程學院,8,6.1.2,指針變量的聲明和初始化,在聲明指針變量時的,,有兩個含義,聲明變量,va1,va2,ch1,ch2,都是指針變量,說明變量,va1,和,va2,的類型是,int,型,即,指向,整型變量的指針,va1,和,va2,所指定的地址單元中,只能存放整型數(shù)據(jù)。類似地,ch1,和,ch2,的類型是,char,型,它們所指定的地址單元中,只能存,放字符,指針變量都是有類型的,指針變量的類型就是它,所指定的地址單元中存放的數(shù)據(jù)的類型,2018/9/20,北京郵電大學信息

5、與通信工程學院,9,6.1.2,指針變量的聲明和初始化,指針變量的初始化有兩種方法:在聲明時的初,始化和聲明后的初始化,聲明指針變量時就進行初始化的格式是,類型名,指針變量名,變量名,其中的變量名應該是已經(jīng)聲明或定義的同類型變量,名。例如,char ch1,Y,ch2,A,char *pch1,2018/9/20,北京郵電大學信息與通信工程學院,10,6.1.2,指針變量的聲明和初始化,也可以在聲明指針變量后,用賦值的方式對它,們進行初始化。例如,int i1,Y,i2,A,int *pi1, *pi2,pi1,pi2,沒有初始化指針變量是不可以使用的。編譯帶,有這樣的指針變量的程序,編譯系統(tǒng)

6、會給出警,告,而運行時會出現(xiàn)錯誤,6.2,指針的運算,2018/9/20,11,北京郵電大學信息與通信工程學院,6.2,指針的運算,表,6.1,指針的運算,2018/9/20,12,北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,13,6.2.1,指針的賦值運算,指針的賦值運算一定是地址的賦值。用來對指針變量,賦值的可以是,同類型變量的地址,同類型的已經(jīng)初始化的指針變量,其他同類型的指針,此外,也可以用,0,或者,NULL,對指針變量賦值。使得變,量包含的是“空指針”,即不指向任何的內(nèi)存物理地,址,必須注意:不同類型的指針是不可以互相賦值的。在,指針賦值時,

7、不存在類型自動轉(zhuǎn)換的機制,2018/9/20,北京郵電大學信息與通信工程學院,14,例,6.1,觀察以下指針賦值運算的結(jié)果。如果將注釋去,掉,結(jié)果將如何,include,using namespace std,void main(,int va1=100,*pva1,float vf1=A,*pvf1,*pvf2,int *pva2=NULL,coutvalue of pva1 is pva2endl,pva1,pvf1=pvf2,coutpva1,coutpvf1 pvf2endl,pvf1=pva1,value of pva1 is 0 x00000000,0 x0012FF7C 0 x0

8、012FF7C,0 x0012FF74 0 x0012FF74,注釋去掉會出現(xiàn)編譯錯誤,2018/9/20,北京郵電大學信息與通信工程學院,15,6.2.2,間接引用運算,間接引用運算符,是一種一元算符,它和,指針變量連用,對指針所指向的內(nèi)存地址單元,進行間接訪問。使用的格式是,指針變量,如果指針變量,iptr,指向整型變量,va,iptr,就是,變量,va,的內(nèi)容,2018/9/20,北京郵電大學信息與通信工程學院,16,例,6.2,對變量的直接訪問和間接訪問:寫出以下程序,運行結(jié)果,include,using namespace std,void main(,char ch1=a,*ch,

9、int k1=100,ch,指針,ch,指向變量,ch1,cout*ch=*chendl,間接訪問,ch=B,coutch1=ch1endl,直接訪問,ch1=k1,cout*ch=*chendl,間接訪問,運行結(jié)果,ch=a,ch1=B,ch=d,2018/9/20,北京郵電大學信息與通信工程學院,17,例,6.3,定義指向指針的指針變量。觀察對這種指針變量間,接訪問的結(jié)果,include,using namespace std,void main(,int va=100,*pva,*ppva; /ppva,是指向指針的指針,int k1=100,pva,cout*pva=*pvaendl,

10、間接訪問結(jié)果是,整型數(shù),ppva,cout*ppva=*ppvaendl;,間接訪問結(jié)果是,地址,coutpva=pvaendl,就是指針,pva,的內(nèi)容,運行結(jié)果,pva=100,ppva=0 x0012FF7C,pva=0 x0012FF7C,2018/9/20,北京郵電大學信息與通信工程學院,18,6.2.2,間接引用運算,2018/9/20,北京郵電大學信息與通信工程學院,19,6.2.3,指針的算術(shù)運算,指針可以進行的算術(shù)運算只有加法和減法,指針可以和一個整數(shù),n,做加法或者減法運算,指針,p,和整數(shù),n,相加,相,減,的含義是指向當前,指向位置,p,的前方或后,方第,n,個數(shù)據(jù)的地

11、址,2018/9/20,北京郵電大學信息與通信工程學院,20,例,6.3,通過指針的間接訪問,輸出下標為偶數(shù)的數(shù)組元素,的值,include,using namespace std,void main(,int k110=11,24,37,44,58,66,79,86,93,108,*k,k,for(int i=0;i10;i=i+2,coutk1i=*(k+i),coutendl,運行結(jié)果,K10=11 k12=37,數(shù)組第一個元素(下標為,0,的地址賦值給指針,k,每次循環(huán),指針加,2,2018/9/20,北京郵電大學信息與通信工程學院,21,6.2.3,指針的算術(shù)運算,指針和指針的直接加

12、法是沒有意義的,也是不允許的,指針和指針的減法是可以進行的,其意,義是求出兩個指針之間可以存放幾個指,定類型的數(shù)據(jù),不允許用一個整數(shù)減一個指針,2018/9/20,北京郵電大學信息與通信工程學院,22,6.2.4,指針的關(guān)系運算和邏輯運算,相同類型的指針可以進行各種關(guān)系運算。比較,兩個指針相等還是不相等,進行指針“大于”、“小于”的比較,只是要,判定指針在內(nèi)存中的相對位置,指針和一般的整數(shù)比較是沒有意義的,也是不,允許的。惟一可以和指針比較的整數(shù)是,0,通,過指針和,0,的比較來判定指針本身是不是空指,針,2018/9/20,北京郵電大學信息與通信工程學院,23,6.2.5 void,類型指針

13、,void,類型的指針就是“無類型”指針。聲明的,方式如下,void,指針名,void,類型的指針變量中存放的也是內(nèi)存的地址,但是不指定這個地址單元內(nèi)的數(shù)據(jù)的類型,2018/9/20,北京郵電大學信息與通信工程學院,24,6.2.5 void,類型指針,void,類型的指針的使用,任何其他類型的指針都可以賦值給,void,指針。必須,注意,這樣賦值后的,void,指針的類型仍然是,void,void,類型指針不可以直接賦值給任何其他類型的指,針,無論何時,void,指針都不可以通過間接引用來訪問,內(nèi)存中的數(shù)據(jù),要通過,void,類型指針訪問內(nèi)存的數(shù)據(jù),必須進行指,針類型的強制轉(zhuǎn)換,才可以通過指

14、針間接引用訪問,內(nèi)存數(shù)據(jù),2018/9/20,北京郵電大學信息與通信工程學院,25,void,類型指針,void,類型指針還有一個具體的應用:顯示字符,指針的內(nèi)容。除了字符指針外,其他指針都可,以直接用,cout,語句來輸出地址值。但是,用,cout,輸出字符指針時,則是輸出它所指向的字,符串。可以將字符指針強制轉(zhuǎn)換為,void,指針,再用,cout,語句輸出,就可以看到地址值。如,char *pch=Hello C,coutpchendl,cout(void*)pchendl,2018/9/20,北京郵電大學信息與通信工程學院,26,例,6.4,使用,memcpy,通用復制函數(shù)復制數(shù)組,in

15、clude,using namespace std,include,void main(,char src10= 345678,char dest10,char* pc=(char*)memcpy(dest,src,10,cout pc endl,int s13=1,2,3,int d13,int *pi=(int*)memcpy(d1,s1,12,cout*pi *(pi+1) *(pi+2)endl,運行結(jié)果,012345678,1 2 3,復制字符數(shù)據(jù),10,個,字節(jié),復制整型數(shù)據(jù),12,個,字節(jié),2018/9/20,北京郵電大學信息與通信工程學院,27,6.2.6,指針類型轉(zhuǎn)換,實際應

16、用的指針變量都是有類型的,指針類型就是,指針所指的地址空間所存放的數(shù)據(jù)的類型,除了,void,指針,不同類型的指針是不可以自動類,型轉(zhuǎn)換的,也就不能進行賦值運算。在例,6-1,中的,語句,pvf1=pva1,整型指針賦值給,float,指針,就是,有語法錯誤的語句,指針類型不僅不能自動轉(zhuǎn)換,也不能進行強制類型,轉(zhuǎn)換,2018/9/20,北京郵電大學信息與通信工程學院,28,指針類型轉(zhuǎn)換,若,pch,是字符指針,p,是,double,類型指針,以下的語,句,pch=static_cast(p,在編譯時有語法錯誤:“不能將,double,轉(zhuǎn)換為,char*”,也就是說指針的強制類型轉(zhuǎn)換也是不允許,

17、的,但是,如果使用,C,風格的類型轉(zhuǎn)換,pch=(char*)p,在編譯時沒有語法錯誤,僅在執(zhí)行時有問題,所以,還是要使用,static_cast,來進行強制類型轉(zhuǎn)換,唯一允許的是,void,指針和其它指針類型之間的轉(zhuǎn)換,2018/9/20,北京郵電大學信息與通信工程學院,29,例,6-5,利用格式控制符,hex,可以顯示整數(shù)的機器數(shù)的程序,include,using namespace std,void main(,float f=1.0,float* fPtr=,浮點指針,void* fv,int* iPtr=static_cast(fv,浮點變量地址賦給整型指針,cout f endl,

18、*iPtr,hex*iPtrendl,*fPtr endl,6.3,指針訪問動態(tài)內(nèi)存,2018/9/20,30,北京郵電大學信息與通信工程學院,指針訪問動態(tài)內(nèi)存,動態(tài)內(nèi)存是在程序執(zhí)行時才可以申請、使用和,釋放的內(nèi)存。也就是存放動態(tài)數(shù)據(jù)的內(nèi)存區(qū)域,存放動態(tài)數(shù)據(jù)的區(qū)域稱為“堆”,動態(tài)內(nèi)存也,稱為堆內(nèi)存,動態(tài)內(nèi)存不能通過變量名來使用,而只能通過,指針來使用,2018/9/20,31,北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,32,6.3.1,動態(tài)內(nèi)存的申請和釋放,C,中通過運算符,new,申請動態(tài)內(nèi)存,運算符,delete,釋放動態(tài)內(nèi)存,動態(tài)內(nèi)存申請運算符,

19、new,的使用格式,new,類型名,初值,運算的結(jié)果:如果申請成功,返回指定類型內(nèi)存的,地址;如果申請失敗,返回,NULL,指針,動態(tài)內(nèi)存使用完畢后,要用,delete,運算來釋放,delete,運算符使用格式,delete,指針名,2018/9/20,北京郵電大學信息與通信工程學院,33,6.3.2,動態(tài)數(shù)組空間的申請和釋放,申請動態(tài)一維數(shù)組時,要在,new,表達式中加上,申請數(shù)組的大小,new,類型名,常量表達式,注意:在動態(tài)申請數(shù)組空間時,不可以對數(shù)組進行,初始化,也可以申請二維數(shù)組的空間,int (*pi_marray)4,pi_marray = new int34,釋放動態(tài)數(shù)組空間都

20、用相同的表達式,delete,指針名,2018/9/20,北京郵電大學信息與通信工程學院,34,6.3.3,內(nèi)存泄漏和指針懸掛,內(nèi)存泄漏是指動態(tài)申請的內(nèi)存空間,沒有正常,釋放,但是也不能繼續(xù)使用的情況。如,char *ch1,ch1 = new char(A,char *ch2 = new char,ch1=ch2,原來為,ch1,所申請的存放字符,A,的空間就不可能再,使用了,產(chǎn)生了內(nèi)存泄漏,2018/9/20,北京郵電大學信息與通信工程學院,35,6.3.3,內(nèi)存泄漏和指針懸掛,讓指針指向一個已經(jīng)釋放的空間,即所謂的指,針懸掛,Dangling,如,char *ch1, *ch2,ch1

21、= new char,ch2 = ch1,ch2 = B,delete ch1,指針,ch2,就是指向了一個已經(jīng)釋放的地址空間,形成,指針懸掛。如果還要用,delete,ch2,語句來釋放,ch2,所指向的空間,就會出現(xiàn)運行錯誤,6.4,指向結(jié)構(gòu)體的指針,2018/9/20,36,北京郵電大學信息與通信工程學院,指向結(jié)構(gòu)體的指針,定義變量時,我們可以定義指向,int,型的指針變,量,類似的,可以有指向新定義的結(jié)構(gòu)型數(shù)據(jù),類型的指針變量,聲明了指向結(jié)構(gòu)的指針后,必須對指針初始化,現(xiàn)在我們知道對于指針的初始化有兩種方法,其一是用已經(jīng)定義的變量地址來初始化,其二,是用,new,申請一個地址來對指針賦

22、值,2018/9/20,37,北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,38,具體對結(jié)構(gòu)指針來說,1,可以將結(jié)構(gòu)變量的地址賦給結(jié)構(gòu)指針,使用取地址“,操作,得到結(jié)構(gòu)變量的地址,這個地址就是結(jié)構(gòu)的第一個成,員的地址,例如,struct student,聲明新的數(shù)據(jù)類型,long num,學號,char name20,姓名,float score,成績,student stu=20041118,Li Li,F,18,定義結(jié)構(gòu)變量并初始化,student * ps,定義結(jié)構(gòu)指針并初始化,2018/9/20,北京郵電大學信息與通信工程學院,39,2,使用,ne

23、w,操作在堆中給結(jié)構(gòu)指針分配空間,例如,student * ps=new student,定義結(jié)構(gòu)指針用動態(tài)地址初始化,用結(jié)構(gòu)指針訪問結(jié)構(gòu)成員時,用箭頭操作符代替,原來的點操作符對結(jié)構(gòu)體成員進行操作。比如,把,學生的成績輸出顯示,語句如下,coutscore,其中,ps-score,等價于,*ps).score,2018/9/20,北京郵電大學信息與通信工程學院,40,解:說明:每個員工的信息包括姓名、工作證號、薪水,定義,為結(jié)構(gòu)類型。定義結(jié)構(gòu)指針并讓它的指向確定,通過結(jié)構(gòu)指,針訪問結(jié)構(gòu)成員,輸出顯示員工的信息,例,6-6,結(jié)構(gòu)指針的定義和使用,include,include,using na

24、mespace std,struct Employee,char name20,unsigned long id,float salary,例,6-6,結(jié)構(gòu)指針的定義和使用,2018/9/20,北京郵電大學信息與通信工程學院,41,void main(,Employee pr1,Employee* prPtr,prPtr,strcpy(prPtr-name,zhang san,prPtr-id=98001,prPtr-salary=3350.0,cout,name,id,salary endl,程序運行結(jié)果,zhang san 98001 3350,6.5,引用概念,2018/9/20,42,

25、北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,43,引用概念,引用,Reference,是,C,中新引入的概念,也是,C,語言中不存在的數(shù)據(jù)類型,引用是變量或者其他編程實體(如對象)的別名,因此,引用是不可以單獨定義的。如圖,6.4(a,所示,變量,A,在內(nèi)存中有自己的地址,而,A,的引用,B,實際,上就是變量,A,只是,A,的另外一個名字,2018/9/20,北京郵電大學信息與通信工程學院,44,6.5.1,引用的聲明,引用是通過運算符,來定義的,定義的格式如下,類型名,引用名,變量名,其中的變量名必須是已經(jīng)定義的,并且和引用的,類型必須相同。例如,in

26、t someInt,int,必須注意:引用必須在聲明的時候就完成初始化,不可以先聲明引用,然后再用另一個語句對它初,始化,2018/9/20,北京郵電大學信息與通信工程學院,45,引用有以下的特點,引用不能獨立存在,它只是其他變量的別名,引用必須在聲明的同時就初始化,引用一旦定義,引用關(guān)系就不可以更改,即,B,若,是,A,的引用,就不可能是其他變量的引用,引用的類型就是相關(guān)的變量的類型,引用的使用,和變量的使用相同,2018/9/20,北京郵電大學信息與通信工程學院,46,例,6-7,引用的使用。觀察以下程序的結(jié)果,include,using namespace std,void main(,

27、int intA=10,int,潣瑵,引用的值和相關(guān)變量值相同,refA=refAendl,refA=5,潣瑵,引,用,的,變,化,則,相,關(guān),變,量,也,變,化,intA=intAendl,潣瑵,引用的地址和相關(guān)變量地址相同,intA,的地址,潣瑵,引用的地址和相關(guān)變量地址相同,refA,的地址,6.5.2,引用的使用,2018/9/20,北京郵電大學信息與通信工程學院,47,引用的值和相關(guān)變量值相同,refA=10,引用的變化,則相關(guān)變量也變化,intA=5,引用的地址和相關(guān)變量地址相同,intA,的地址,0 x0012FF7C,引用的地址和相關(guān)變量地址相同,refA,的地址,0 x001

28、2FF7C,程序的結(jié)果,6.6,指針和引用作為函數(shù),的參數(shù),2018/9/20,48,北京郵電大學信息與通信工程學院,2018/9/20,北京郵電大學信息與通信工程學院,49,指針和函數(shù),在程序設(shè)計中,指針有很多應用。其中,之一就是用指針作為函數(shù)的參數(shù),從而,形成了,C,函數(shù)調(diào)用中的另一種調(diào)用方,式:地址調(diào)用,2018/9/20,北京郵電大學信息與通信工程學院,50,6.6.1,指針作為函數(shù)的參數(shù),用指針作為函數(shù)參數(shù),實現(xiàn)地址調(diào)用,必須滿,足以下條件,函數(shù)的形式參數(shù)是指針變量,函數(shù)的實參數(shù)是內(nèi)存的地址,具體來說可以,是數(shù)組名、變量的地址、用變量地址初始化,的指針,形參指針類型和實參地址類型必須

29、相同,2018/9/20,北京郵電大學信息與通信工程學院,51,6.6.1,指針作為函數(shù)的參數(shù),滿足以上條件后,這樣的函數(shù)調(diào)用在使用上有,以下的特點,實參傳遞給形參的是內(nèi)存的地址,所以形參指,針指向?qū)崊⒆兞?形參指針通過間接引用,直接訪問實參變量,包括改變實參變量的值,函數(shù)調(diào)用后,可以保留對實參變量的操作結(jié)果,如果有多個實參,就可以有多個實參變量在函,數(shù)調(diào)用中得到修改,2018/9/20,北京郵電大學信息與通信工程學院,52,例,6.8,編寫數(shù)據(jù)交換的函數(shù)。在,main,中調(diào)用這個函數(shù),交換,main,中定義的變量,include,using namespace std,void Swap(i

30、nt *a, int *b,void main(,int x(5), y(10,潣瑵,主函數(shù)變量的值,x=x y=yendl,Swap,潣瑵,返回后變量的值,x=x y=yendl,void Swap(int *a, int *b,int t,t=*a,a=*b,b=t,撓畯?尼,函數(shù)中完成了交換,a=*a *b=*bendl,運行結(jié)果,主函數(shù)變量的值,x=5 y=10,函數(shù)中完成了交換,a=10 *b=5,返回后變量的值,x=10 y=5,變量的地址作為實參數(shù),指針變量作為形式參數(shù),2018/9/20,北京郵電大學信息與通信工程學院,53,6.6.1,指針作為函數(shù)的參數(shù),程序中用變量,x,和

31、,y,的地址作實參,傳遞給指針,a,和,b,如圖,6.1(a,通過間接引用,a,和,b,進,行交換,實際上就是,x,和,y,進行交換,如圖,6.1(b,2018/9/20,北京郵電大學信息與通信工程學院,54,6.6.2,引用作為函數(shù)參數(shù),引用使用最多的場合是作為函數(shù)的形式參數(shù),引用作為函數(shù)的形式參數(shù)具有以下的特點,引用作為形式參數(shù)時,實參數(shù)是相同類型的變量,引用作為形式參數(shù),參數(shù)傳遞屬于地址傳遞,引用作為形式參數(shù)時,在函數(shù)中并不產(chǎn)生實參數(shù)的,副本,形式參數(shù)的引用和實參數(shù)的變量實際上是同,一個實體,函數(shù)對引用的操作,也是對實參變量的操作,函數(shù),調(diào)用可以改變實參數(shù)的值,2018/9/20,北京郵

32、電大學信息與通信工程學院,55,例,6.9,用引用作為形式參數(shù),通過函數(shù)調(diào)用,交換兩個實,參數(shù),include,using namespace std,void swap_1(int i size; i+, j,resultj = listi,return result,返,回局部數(shù)組的地址,2018/9/20,北京郵電大學信息與通信工程學院,65,void printArray(int const *list, const int size,for (int i = 0; i size; i,cout listi,void main(,int list = 1, 2, 3, 4, 5, 6,

33、int *pList = reverse(list, 6);,獲得倒序后數(shù)組的地址,printArray(pList, 6,顯示倒序后的數(shù)組,程序運行結(jié)果,858993460,858993460,858993460,858993460,858993460 5,結(jié)果完全不對。原因就在于指針函數(shù)返回的是函數(shù)局部數(shù)組,的地址,2018/9/20,北京郵電大學信息與通信工程學院,66,例,6-16,對例,6-15,的修改。只要修改指針函數(shù),reverse,可以在函數(shù)這申請一個動態(tài)數(shù)組的地址,最后返回這個地,址就可以。注意不要忘了用,delete,來釋放這個地址,include,using namesp

34、ace std,int * reverse(int const * list, const int size,指針函數(shù),int *result = new intsize,函數(shù)中定義的動態(tài)數(shù)組,for (int i = 0, j = size - 1; i size; i+, j,resultj = listi,return result,返回動態(tài)數(shù)組的地址,2018/9/20,北京郵電大學信息與通信工程學院,67,void printArray(int const *list, const int size,for (int i = 0; i size; i,cout listi,void

35、main(,int list = 1, 2, 3, 4, 5, 6,int *pList = reverse(list, 6,獲得倒序后數(shù)組的地址,printArray(pList, 6,顯示倒序后的數(shù)組,delete pList,程序運行結(jié)果,6 5 4 3 2 1,2018/9/20,北京郵電大學信息與通信工程學院,68,6.7.2,用引用作為函數(shù)的返回值,返回引用有以下需要注意的地方,返回引用需要在函數(shù)的返回值類型中加以說明,形,式為,類型名,函數(shù)名,形式參數(shù)表,返回引用的返回語句就是,return,變量名,返回引用實際是返回地址。在使用上,或者直接使,用這個地址;或者使用這個地址單元的

36、數(shù)據(jù),返回的引用可以作為左值繼續(xù)操作,而返回的變量,值是不可以繼續(xù)運算的。這是返回引用和返回變量,值在使用上的主要區(qū)別,2018/9/20,例,6-17,引用作為函數(shù)的返回值,include,include,using namespace std,struct person,char name15,int contribution,double bonus,定義結(jié)構(gòu)體,person p1=Li Li,500,0,p2=Zhao Zhao,600,0,兩,名職工是全局變量,person *,n=sizeof(array3,strncpy( array3, array1, n-1,復制,array

37、1,的,n-1,個字符到,array3,array3 14 = 0,添加,0,到,array3,cout The string in array3 is: array3 endl,不包括提示的運行結(jié)果,Happy Birthday to You,Happy Birthday to You,Happy Birthday,復制,array1,到,array2,沒有問題,復制,array1,到,array3,空間不夠,有運行錯誤,按實際數(shù)組大小,復制,array1,到,array3,沒有問題,6.9,通過指針訪問數(shù)組,2018/9/20,77,北京郵電大學信息與通信工程學院,2018/9/20,北京

38、郵電大學信息與通信工程學院,78,通過指針訪問數(shù)組,指針和數(shù)組有天然的聯(lián)系。因為數(shù)組名本身,就是地址,也就是某種類型的指針。將指針,和數(shù)組名聯(lián)系起來,訪問數(shù)組就多了一種方,法,雖然一維數(shù)組名和二維數(shù)組名都是地址,都,可以看作是某種指針,但是指針的類型是不,同的。因此,通過指針訪問一維數(shù)組和二維,數(shù)組的方法是不同的,2018/9/20,北京郵電大學信息與通信工程學院,79,6.9.1,通過指針訪問一維數(shù)組,要通過指針訪問一維數(shù)組,必須首先聲明一個和,數(shù)組類型相同的指針,并且用數(shù)組名來對指針初,始化,如,int A10, *pa=A,然后,就可以用多種方式訪問數(shù)組元素,數(shù)組名和下標,如,A0,A4

39、,指針和下標,如,pa0,pa4,指針加偏移量的間接引用,如,pa+4,數(shù)組名加偏移量的間接引用,如,A+4,指針自加后的間接引用,如,pa,2018/9/20,北京郵電大學信息與通信工程學院,80,例,6.19,求數(shù)組內(nèi)所存放的字符串的長度,include,using namespace std,void main(,char ChArray=This is a string.,*ptch,int i,j,k,offset1,offset2,ptch=ChArray,指針初始化,for(i=0;ChArrayi!=0;i,coutThe length of the string is:ien

40、dl,for(j=0;ptchj!=0;j,coutThe length of the string is:jendl,for(offset1=0;*(ChArray+offset1)!=0;offset1,coutThe length of the string is:offset1endl,for(offset2=0;*(ptch+offset2)!=0;offset2,coutThe length of the string is:offset2endl,for(k=0;*ptch+!=0;k,coutThe length of the string is:kendl,運行結(jié)果,都相同,

41、方式,1,數(shù)組名和下,標,方式,2,指針和下,標,方式,3,數(shù)組名加,偏移量的間接引用,方式,4,指針加偏,移量的間接引用,方式,5,指針自加,的間接引用,2018/9/20,北京郵電大學信息與通信工程學院,81,例,6.20,求整型數(shù)組的平均值,顯示數(shù)組元素和平均值,include,using namespace std,void main(,int intArray10=8,11,23,34,45,56,65,78,86,97,*ptint,int i,num,sum,float average,ptint=intArray,sum=0,num=sizeof(intArray)/sizeof(*intArray,for(i=0;inum;i,sum=sum+*ptint,average=(float)sum/num,ptint=intArray,潣瑵,數(shù)組元素是,n,for(i=0;inum;i,cout*ptint+,co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論