第09章 (06級)指針和引用.ppt_第1頁
第09章 (06級)指針和引用.ppt_第2頁
第09章 (06級)指針和引用.ppt_第3頁
第09章 (06級)指針和引用.ppt_第4頁
第09章 (06級)指針和引用.ppt_第5頁
已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第 9 章 指針和引用,本章主要內(nèi)容,9.1 指針和指針變量 9.2 指針作函數(shù)參數(shù) 9.3 指針和指向數(shù)組的指針 9.4 指針數(shù)組 9.5 指向指針的指針 9.6 指針和函數(shù) 9.7 指針小結(jié) 9.8 引用和其他類型的指針 9.9 存儲空間的動態(tài)分配和釋放 9.10 鏈表及其應(yīng)用, 內(nèi)存中的一個字節(jié)為一個存儲單元( Byte)。 存儲單元的編號稱為地址。 變量的地址是指該變量所在存儲區(qū)域的第一個 字節(jié)(單元)的地址。,9.1 指針和指針變量 9.1.1 指針的概念,例:int a; float b; char c;,這三個地址就稱為變量 a、b、c 的指針。,指針也是一個數(shù)值, C+提供了一

2、種類型的變量用于存放該數(shù)值, 即存放指針,這種變量就是指針變量。,9.1.2 指針變量的定義,指針變量的定義格式:類型說明符 *指針變量名;,例:int *p ; 定義 p 為指向 int 類型量的指針變量 float *f ; 定義 f 為指向 float 類型量的指針變量,int * 為int型指針類型標(biāo)識符。 float * 為float型指針類型標(biāo)識符。,幾點說明: 一個指針變量只能指向同一數(shù)據(jù)類型的變量,該 數(shù)據(jù)類型是在定義指針變量時明確給定的。 C+語言規(guī)定有效數(shù)據(jù)的指針不指向0單元(為非0值), 如果指針變量值為0,即NULL(在ios.h中已定義), 表示空指針,即不指向任何變

3、量。 不要把地址值與整數(shù)類型值相混淆。 例如:地址2000與整型量2000是兩個不同的概念。,1、 /將整型變量 m 的地址值賦給指針變量 p,9.1.3 有關(guān)指針的運算符 m=200 ; p=,200,2、* 間接存取運算 功能:訪問指針指向的變量 例9.2 int *p , m=200 , n ; p= /將 100 賦給指針變量 p 所指向的變量 m,n,9.1.4 指針變量的初始化 初始化格式:類型說明符 *指針變量名=初始地址值 ; 例: char c ; char *pc = /* 賦值語句,定義后進行 */,兩種方式等效,9.1.5 直接訪問和間接訪問,在C+中定義的所有變量,編

4、譯器都會記錄它們的屬性, 便于以后對它們的訪問, 如在例9.1中定義的兩個變量 m 和 p, 編譯器記錄的屬性如下表:,表9-1 變量及其屬性,1. 直接存取方式(直接訪問) 按變量地址存取變量值的方式稱為直接存取方式, 在程序中體現(xiàn)為直接使用變量名來存取變量值。,2. 間接存取方式(間接訪問),如果變量 p 存放著變量 m 的地址,那么, 對變量 m 的訪問可以首先訪問變量 p,取得 變量 m 的地址,然后按該地址進行對 m 的存取 操作, 稱為間接存取方式。 在程序中體現(xiàn)為通過 p 來存取變量 m 的值。,例: m=5,n=m 直接存取 m *p=5,n=*p 間接存取 m,間接存取的前提

5、是什么?,小結(jié): char *cp= ,輸出:? AA BB aa,例9.4 變量的直接訪問和間接訪問 int a=1; float b=5.0; char c=A; int *p1; float *p2; char *p3; p1=,運行結(jié)果:?,1, 5, A 1, 5, A,續(xù):*p1=*p1+1; *p2=*p2+2; *p3=*p3+3; cout a , b , c endl;,運行結(jié)果:?,2, 7, D,關(guān)于指針使用的幾點說明: 指針變量必須通過初始化或賦值獲得值后(即必須明確指向某一變量),才可以利用它進行間接訪問。 若有 int m ; int *p = 注意指針變量的指向

6、類型,只有相同類型數(shù)據(jù)變量的地址才能賦給該指針變量。即整型變量的地址只能賦給整型指針。如在例9.4中,若出現(xiàn) p1 = 是無意義的。 允許將一個整型常數(shù)(為內(nèi)存的一個絕對地址)經(jīng)強制類型轉(zhuǎn)換后賦給指針變量,如: float *fpp ; fpp = (float *)5000 ; 其意義:將5000作為一個地址值賦給指針變量fpp 。,例9.5 交換兩個指針的指向,int x=10, y=20; int *p1=,cout *p1 t *p2 endl; t=p1; p1=p2; p2=t; cout *p1 t *p2 endl;,例9.6 通過指針, 交換兩個指針?biāo)赶虻淖兞康闹?int

7、x=10, y=20, t; int *p1 =,cout x , y endl; t=*p1;*p1=*p2; *p2=t; cout x , y endl;,9.1.6 地址值的輸出,例9.7 輸出指針的值 #include void main(void) int a, *p1; float b, *p2; double d, *p3; p1= ,輸出結(jié)果:p1=0 x0012FF7C p2=0 x0012FF74 p3=0 x0012FF68,如果希望輸出 十進制地址值, 則改寫程序為:=, 地址值的輸出(輸出十進制地址值),例:#include void main( ) int a,

8、*p1; float b, *p2; double d, *p3; p1= ,輸出結(jié)果:p1=6684148 p2=6684140 p3=6684132, 指針使用的常見錯誤 1、使用未初始化的指針變量 void main( ) int x,*p ; x=0 ;*p=x ; . 2、指針變量所指向的數(shù)據(jù)類型與其定義的類型不符 void main( ) float x,y ; int *p ; p= . ,#include /復(fù)習(xí) void main( ) int x=10, y ; int *p1= ,例9.8 基本類型量做函數(shù)參數(shù) #include void swap(int x,int y

9、) int t; t=x; x=y; y=t; void main( ) int x=3, y=9; swap(x,y); cout x , yendl; 輸出?,局部動態(tài)變量,3,9,main( ) 工作區(qū),swap( ) 工作區(qū),9.2 指針作函數(shù)參數(shù) 9.2.1基本類型量做函數(shù)參數(shù),實參x、y 和形參 x、y 是不同的變量,占據(jù)不同的存儲空間。 參數(shù)傳遞時:int x = x, int y = y ;,例9.9指針做函數(shù)參數(shù) #include void swap(int *px, int *py) int t; t=*px;*px=*py;*py=t; void main( ) int

10、x=3,y=9,*p1,*p2; p1= 輸出?,局部動態(tài)變量,9,3,指針作為函數(shù)參數(shù), 可以改變主調(diào)函數(shù)中 變量的值。,main( ) 工作區(qū),swap( ) 工作區(qū),參數(shù)傳遞時, 有:int *px=p1; int *py=p2;,被調(diào)函數(shù)中參數(shù)的指針,相當(dāng)于一只手,9.2.2 指針變量做函數(shù)參數(shù),例9.10約簡分?jǐn)?shù)(用分子分母的最大公約數(shù)除分子分母) void lowterm(int *num ,int *den) int n ,d ,r ; n=*num ; d=*den ; while(d!=0) /*求分子分母的最大公約數(shù)*/ r=n%d ; n=d ; d=r ; if(n1)

11、 /* n 是最大公約數(shù)*/ *num=*num/n ; *den=*den/n ; /*直接對主調(diào)函數(shù)中的實參進行間接訪問操作*/ ,例:約簡分?jǐn)?shù)(續(xù)) #include void main(void) int a=14,b=21; cout “分?jǐn)?shù):”; cout a / b endl; cout “約簡后:”; lowterm( ,輸出:分?jǐn)?shù):14/21 約簡后:2/3,9.2.3 從被調(diào)函數(shù)中返回信息的幾種方法 1、利用return語句返回值 (只能返回一個值) 例:int min(int a, int b) return(ab)?a:b); ,2、利用全局變量得到函數(shù)調(diào)用結(jié)果 (安全

12、性欠佳) 例:int max,min ; /可得到多個結(jié)果 void fun(int a,int b) max=(ab)?a:b ; min=(ab)?a:b ; void main( ) fun(5,8); coutmax,minendl; ,3、利用指針變量作為函數(shù)參數(shù)來取得函數(shù)調(diào)用的結(jié)果。 (較好,可安全地得到多個結(jié)果值) 涉及參數(shù)空間的分配 例:void fun(int a,int b,int *pmax,int *pmin) *pmax=(ab)?a:b ; *pmin=(aab; fun(a,b, ,4、利用引用作為函數(shù)參數(shù)來取得函數(shù)調(diào)用的結(jié)果 (較好,可安全地得到多個結(jié)果值) 不

13、涉及參數(shù)空間的分配 例:void fun(int a, int b, int ,形參變量是實參的別名, 使用起來較方便、直觀。,假定: b = = 1000, 且兩個數(shù)組連續(xù)存放 則:a = = ?,9.3 指針和指向數(shù)組的指針 9.3.1 指針和一維數(shù)組,1.數(shù)組名- 數(shù)組元素在內(nèi)存中連續(xù)存放, 數(shù)組名是該存儲區(qū)的起始地址, 是地址常量。,例:int a10; float b10; a 是 a0 元素的起始地址。 b 是 b0 元素的起始地址。,1040,2.指向一維數(shù)組元素的指針變量,例:int a10; / 假定a的值為1040 int *p; / p是指向整型變量的指針, a數(shù)組的元素

14、為整型變量, 那么 p 可以指向 a 數(shù)組的任意元素。,p=a;,/ 結(jié)果 p=1040,p 指向a0,p+;,/ 結(jié)果 p=1044,p+;,/ 結(jié)果 p=1048,p- -;,/ 結(jié)果 p2=1044,向下移動一個元素的位置,若 p = 則 *p 訪問a6,向上移動一個元素的位置,3.指針可進行的運算(一般為加、減、比較運算),(1)指針數(shù)值 (2)指針-指針 (3)指針 比較 指針,(1)指針數(shù)值 運算的意義 如果:p 是指針,n 是數(shù)值 則:pn 表示 p 向后/向前移動 n 個元素位置。 即:結(jié)果 p 的值n*c,若 p 是 int 型指針,則 c 等于 4 若 p 是 char 型

15、指針,則 c 等于 1 若 p 是 float 型指針,則 c 等于 4 .,例9.11 用指針間接訪問數(shù)組元素 #include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , *p = a ; int sum=0, i ; for( i=0; i10; i+) sum = sum + *(p+i); / *(p+i) pi ai for( i=0; i10; i+, p+) / 指針變量可進行自加、自減運算 cout *p t; cout n sum= sum endl; ,指向相同數(shù)據(jù)類型的指針變量可以相減,其結(jié)果 為兩指針

16、所指向地址之間數(shù)據(jù)的個數(shù)。,例:int *px ,*py , n , a5 ; px=,(2)指針 - 指針 運算的意義,結(jié)果:n 值為3,如果 m = int(py) int(px) ; 則 m 得到的值為 12,= != =,(3)指針 比較 指針,指針的關(guān)系運算是兩個指針?biāo)赶虻牡刂分g的 比較運算,產(chǎn)生的結(jié)果為 0(假)和 1(真)。,例:有定義:double a5,*p1,*p2 ; p1,p2 的指向如圖所示。, p1=NULL 判斷p1是否為空指針?(NULL是系統(tǒng)定義的) 結(jié)果:0,計算: p1=p2 判斷p1,p2是否指向同一變量? 結(jié)果:0, p1p2 判斷p1的地址是否比

17、p2的地址??? 結(jié)果:1, p1!=0 判斷 p1 是否不為空指針? 結(jié)果:1,例9.12 改寫例9.11,注意指針的比較運算。 #include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , *p ; int sum=0 ; for(p = a ; p a+10; p+) / 循環(huán)結(jié)束時, p 的指向? sum = sum + *p ; for(p = a ; p a+10; p+) / 需重新給 p 賦初值 cout *p; cout sum= sum endl; ,以上定義等價于: int a10,*p; p=a ;,例:

18、int a10,*p ; p=, int a10; int *p=, int a10; int *p=a ;,a p+ ; 正確 a=p+2; a+ ;錯誤,例9.13 P145 數(shù)組元素逆向存放 #include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, t ; int *p1=a, *p2=a+9 ; while(p1p2) t = *p1; *p1 = *p2; *p2=t; p1+ ; p2 - - ; for(p1 = a; p1 a+10; p1+) cout *p1 t ; cout endl ; ,void r

19、everse(int b , int n) /* 等價與 int *b */ int i, j, t; i=0; j=n-1; while(ij) t=bi; bi=bj; bj=t; i+; j- -; ,void main(void) int a10=1,2,3,4,5,6,7,8,9,10, i; reverse(a, 10); for(i=0; i10; i+) cout ai t ; cout endl ; ,圖,例9.14將數(shù)組元素逆向存放。,9.3.2一維數(shù)組元素指針做函數(shù)參數(shù),在被調(diào)函數(shù)中數(shù)組元素 的值被改變后, 自動帶回主函數(shù), 不需要return語句返回。 注意:實參a是一

20、個指針。,實參 a,main( ) 函數(shù)存儲區(qū)內(nèi)容,程序,例9.14將數(shù)組元素逆向存放。(續(xù)),*(b+0) *(b+1) *(b+2) . *(b+8) *(b+9) b0 b1 b2 . b8 b9 b+;,在 reverse( ) 函數(shù)中, 將 b 處理成一個 int 型指針, (參數(shù)傳遞時:int *b a) 通過指針 b 訪問 a 數(shù)組中內(nèi)容。,被調(diào)函數(shù)中參數(shù)的指針,相當(dāng)于一只手,void reverse( int b , int n ) int t; int *p2 = b+n-1; while(b p2) t = *b; *b = *p2; *p2=t; b+; p2- ; ,v

21、oid main(void) int a10=1,2,3,4,5,6,7,8,9,10, i; reverse(a, 10); for(i=0; i10; i+) cout ai t ; cout endl ; ,例9.14將數(shù)組元素逆向存放。( 改寫 ), 一維數(shù)組名作函數(shù)參數(shù) 實參和形參的各種寫法,void f( int b , int n ) . bi /或 *( b+i ) b+ void main(void) int a10, *p; p=a; f( a , 10 ); ,例9.15分別求數(shù)組前十個元素和后十個元素之和,int fsum(int *array,int n) int i

22、,s=0; for(i=0;in;i+) s+=(*array+) ; return(s); void main(void) int a15= 1,2,3 14,15 ; int shead, stail; shead=fsum(a,10); / 第 1 次調(diào)用 stail=fsum( ,例9.16 求出數(shù)組元素中的最大值和最小值 void max_min_value (int *array, int n, int *maxp, int *minp) / maxp指向主函數(shù)max變量,minp指向主函數(shù)min變量 int *p, *array_end; array_end = array +

23、n ; *maxp=*minp=*array; for(p=array+1; p *maxp ) *maxp=*p; else if( *p*minp ) *minp=*p; ,例9. 16 續(xù) void main(void) int i, number10, *p = number, max, min; for(i=0; i *( p+i ) ; / 輸入數(shù)組元素值 max_min_value( p, 10, ,C+ 語言中通常用char型指針來處理字符串。 1. 字符數(shù)組和字符指針 (1) 定義一個字符數(shù)組存放字符串 char str10=“Hello!”; str是一維字符數(shù)組名,即起始

24、地址。 字符數(shù)組輸入輸出: cin str; /不可輸入帶空格字符串 cin.getline(str,80);/可輸入帶空格字符串 cout str; 字符數(shù)組賦值:strcpy(str, “ABCD”); 訪問第i個字符 stri, 或 *(str+i) 第i個字符的地址 ,“Hello!”的值是該字符串的首地址。,(3) 字符數(shù)組名(str)與字符指針(strp)的區(qū)別: char str10, *strp; str - 指針常量,不論是否對字符數(shù)組賦值, 數(shù)組空間已分配,str的指向明確。 strp - 指針變量,若不賦初值,則其指向不確定。,輸出字符串:cout strp ;,等價于:

25、char *strp ; strp=“Hello!”;, 賦值: char str10, *strp; strcpy(str, “ABC”); str的指向不變,改變的是存儲單元的內(nèi)容。 strp=“Hello!”; 將 strp 指向字符串常量“Hello!”。 strp=str; 將 strp 指向字符串?dāng)?shù)組str。,使用字符串指針易犯的錯誤: (1) char str10; str=“Hello!”; str是指針常量,不能給常量賦值。,(2) char str10; str =“Hello!”; 不能用賦值語句給數(shù)組整體賦值。,解1:用字符數(shù)組實現(xiàn) #include #include

26、void main( ) char a20=“ABCD”, b10=“EFG”; int i, j; i = strlen(a); / i是字符串a(chǎn) 結(jié)尾0的下標(biāo) for(j=0; bj!=0; i+,j+) ai=bj; ai=0; cout a endl ; ,例9.18將字符串b 的內(nèi)容追加到字符串a(chǎn) 尾部。,輸出:ABCDEFG,解2:用字符指針訪問方式實現(xiàn) #include void main( ) char a20=“ABCD”, b10=“EFG”; char *pa=a, *pb=b; /pa指向a , pb指向b while(*pa!=0) pa+;/循環(huán)結(jié)束后, pa指向a

27、 尾部的0 while(*pb!=0) *pa=*pb; pa+; pb+; *pa=0; pa=a; cout pa endl ; ,2.字符串指針作函數(shù)參數(shù) 例9.19 字符指針做函數(shù)參數(shù) int my_strlen(char *s) / 自定義函數(shù) int n ; for(n=0 ; *s!=0 ; s+) n+ ; return(n); void main( ) char str =“Hello!” ; cout *str t; cout my_strlen(str) t; cout *str endl; ,運行結(jié)果? H 6 H,例9.20 比較兩個字符串的大小 int my_str

28、cmp(char *s, char *t) / 自定義函數(shù) for( ; *s=*t; s+,t+) if(*s=0) return(0); return(*s -*t); void main( ) char s1 =“Hello!”; char *s2=“Hello!”; cout my_strcmp(s1, s2) t; cout my_strcmp(“Hi”, s2)endl; ,說明:字符串作實參,傳遞的是字符串的首地址,輸出:0 4,例9.21:字符串拷貝函數(shù),比較以下幾個函數(shù): void copy_string(char from , char to ) int i=0 ; whi

29、le(fromi!=0) toi=fromi;i+ ; toi=0 ; void copy_string(char from , char to ) int i=0 ; while(toi=fromi)!=0) i+ ; void copy_string(char *from, char *to) while(*to=*from)!=0) to+ ; from+ ; void copy_string(char *from, char *to) while(*to+ = *from+)!=0) ; void copy_string(char *from, char *to) while(*to+

30、 = *from+) ; ,9.3.4 多維數(shù)組指針(二維數(shù)組) 1、二維數(shù)組的地址 (1) 行指針和元素指針 例:有定義:int a34;,二維數(shù)組名 a 指向 a0, a 是行指針, a+1指向下一行, 即指向a1。,a1和a2的意義類似!,注意: a和ai是兩種類型不同的指針常量。 ai的類型是 int * a的類型是 int (*)4,從元素指針的角度來看: 若欲訪問aij,可以寫成 *( ai+j ) 從行指針的角度來看: *(a+i) ai 所以訪問元素aij,也可寫成 *(*(a+i)+j ),(2)二維數(shù)組中元素aij地址的表示: int sum=0, i, j; for(i=

31、0; i *(ai+j); /注意二維數(shù)組元素的訪問方法 for(i=0; i3; i+) for(j=0; j4; j+) sum += *(*(a+i)+j); cout sum endl; ,2. 指向一維數(shù)組的指針變量(行指針) 例:int (*p)4; int a34;,注意:數(shù)組名 a 和 p 同為行指針,但 a 是指針常量, 而 p 是指針變量。,定義一個行指針p,指向一維數(shù)組,該一維數(shù)組 包含4個整型數(shù)值(相當(dāng)于二維數(shù)組的一行元素)。,p=a ; / p和a的類型一樣,類型為 int(*)4,例:輸出一個指定行、列下標(biāo)的二維數(shù)組元素值 void main( ) int a34=

32、.; int (*p)4, i, j; p = a; cin i j; /輸入行下標(biāo)、列下標(biāo) cout a i j = *(*(p+i)+j) endl; ,比較: 與一維數(shù)組名等價的指針變量(指向數(shù)組元素的指針) int a10, *p; / p的類型是 int * p=a; 與二維數(shù)組名等價的指針變量(指向一維數(shù)組的指針) int a34; int (*p)4; p=a; / p的類型是 int (*)4,例9.24 求二維數(shù)組全體元素之和 int total(int(*p)4, int n) /n 行數(shù) int i, j, sum=0; for( i=0; i *(ai+j); sum

33、= total( a, 3 ); cout sum endl; ,3. 二維數(shù)組名做函數(shù)參數(shù),任何有關(guān)二維數(shù)組的算法均可以套用本例形式。,例9.24 改寫 total( )函數(shù) int total(int(*p)4, int n) / n 行數(shù) int i, j, sum=0 ; for( i=0; in; i+, p+ ) for( j=0; j4; j+) sum += *( *p + j ) ; return sum; ,形參二維數(shù)組名的三種寫法,void f( int b34 ) . *(*(b+i)+j) bij, b+ void main( ) int a34; f(a); ,4、

34、將二維數(shù)組看成一維數(shù)組訪問 (1) 通過元素指針訪問二維數(shù)組元素 例9.25 輸出二維數(shù)組全體元素的值。 void main(void) int a34=.; int *p ; for(p=a0; pa0+12; p+) if(p-a0)%4=0) cout endl ; cout setw(4) *p ; cout endl ; ,p,(2)已知一個二維數(shù)組為N行M列,即aNM, 將二維數(shù)組看成一維數(shù)組后,求aij放在物理一維數(shù)組中的第幾個位置?,二維數(shù)組按行存放, aij的前面有 i*M+j 個元素, 若序號從0開始, 則aij的序號是:i*M+j,若 int *p=a0; 則 p+i*M

35、+j 是aij的地址。,void f( int b 4 ) . *(*(b+i)+j) bij void main( ) int a34; f(a); ,解釋二維數(shù)組做參數(shù)時,參數(shù)第一維行數(shù)可缺省原因。,例9.26 輸入二維數(shù)組任一行號 i, 任一列號 j, 輸出其元素aij的值。 void main(void) int a34=.; int *p, i, j; p=a0; cin i j; cout a i j = *(p+i*4+j) endl; ,9.4 指針數(shù)組,數(shù)組元素 的值為:,數(shù)組元素值為指針的數(shù)組稱為指針數(shù)組,9.4.1 指針數(shù)組的定義和使用,1. 基本概念,2. 指針數(shù)組的定

36、義和說明 定義格式:類型說明符 *指針數(shù)組名元素個數(shù) 例:int *p10 ; 數(shù)組p 的10個元素 p0, p1 p9 都是指向 int 型數(shù)據(jù)的指針。 數(shù)組的10個元素都是 int * 類型的。,例:int a=6, b=8, c=2; int *p10; p0 = ,輸出:6, 8, 2,例9.27利用指針數(shù)組輸出另一個數(shù)組中各元素的值 。 #include void main( ) float a5= 2, 4, 6, 8, 10 ; float *p5= ,輸出:2 4 6 8 10,9.4.2 使用指針數(shù)組處理二維數(shù)組 例:int a33, *p3, i ; ( p3是指針數(shù)組 )

37、 for(i=0; i3; i+) pi = ai; (等價于 pi = ),說明:p 數(shù)組的三個元素 分別是指向整型變量的指 針(元素指針)。,例9.28 輸出二維數(shù)組全體元素值 void main(void) int a23 = 1,2,3, 4,5,6 ; int *pa = a0, a1 ; int i, j ; for(i=0; i2; i+) for(j=0; j3; j+) cout *(pai+j) t; cout n; 運行結(jié)果:1 2 3 4 5 6,9.4.3 利用字符指針數(shù)組處理字符串,char *name =George, Mary, Susan, Tom, Davi

38、s;,括號中的每一個字符串都是一個地址值。,#include #include void main( ) char *name = George, Mary, Susan, Tom, Davis ; char *ptr; int i, j, k, n=5;,例9.29 按字典序?qū)⑸鲜?個字符串排序,輸出。 此程序主算法是選擇法排序, 通過交換指針的指向來達(dá)到排序的目的。,for(i=0; i0 ) /字符串比較, k=j; /記住最小字符串指針的下標(biāo)。 if(k!=i) ptr=namei; namei=namek; namek=ptr; /交換指針數(shù)組元素值 for(i=0; in; i+)

39、 /輸出結(jié)果 cout namei endl; ,結(jié)果指針的指向:,運行結(jié)果是: Davis George Mary Susan Tom,指針數(shù)組元素指向的是字符串常數(shù), 每個字符串的長度都不一樣, 所以只能通過交換指針的指向 實現(xiàn)排序。,例9.30改寫例9.29,學(xué)習(xí)如何使用指針數(shù)組做函數(shù)參數(shù)。 #include #include void main( ) void sort(char * , int), print(char * , int); /函數(shù)原型說明,因為函數(shù)定義在后,調(diào)用在前 char *name =George, Mary, Susan, Tom, Davis; int n=

40、5 ; sort( name, n); print( name, n); ,void sort(char *name , int n)/函數(shù)定義,注意參數(shù)的寫法 char *ptr; int i, j, k; for(i=0; i0 ) k=j; if(k!=i) ptr=namei;namei=namek;namek=ptr; void print(char *name , int n) /函數(shù)定義,注意參數(shù)的寫法 for(int i=0; in; i+) cout namei endl; ,(1)int *p; 一般指針,可與一維數(shù)組名等價。 如有:int a10; p=a; 可用pi訪問

41、數(shù)組元素。 (2)int (*p)M; 指向含有 M 個元素的一維數(shù)組, 可與二維數(shù)組名等價。p 是一個行指針。 如有:int a4M; p=a; 可用pij訪問數(shù)組元素。,相應(yīng)的數(shù)據(jù)類型 int (*)M int * int int (*)M int *,指針小結(jié):,float a5=100, 200, 300, 400, 500; float *p5= ,(3)int *pM; 指針數(shù)組,有M個元素, 每個元素都是int 型指針,即有M個指針。,如何訪問ai ?,9.4.4 指針數(shù)組作 main 函數(shù)的形參 main( )函數(shù)的參數(shù)格式: void main( int argc, char

42、 *argv ) . ,形參argc:命令行中參數(shù)的個數(shù) 形參argv:指針數(shù)組的各元素分別指向命令行中 各字符串的首地址。,例9.31 了解 main 函數(shù)參數(shù)的意義 void main(int argc, char *argv ) cout argc= argc endl; cout Command name: argv0 endl; for(int i=1;iargc;i+) cout argvi endl; ,源程序文件名: Li0931.cpp 源程序文件存放位置: D:cpp 可執(zhí)行程序位置: D:cppDebug 可執(zhí)行程序文件名: Li0931.exe,(1)通過DOS命令行執(zhí)

43、行程序,程序的一種執(zhí)行方式,命令行: D:cppDebug Li0931 par1 par2 /p /w ,Project | Settings | Debug | Program arguments,該程序運行后的結(jié)果如下: argc=5 Command name=D:cppDebugLi0931.exe par1 par2 /p /w,演示在集成環(huán)境和 DOS環(huán)境中的運行情況,(2)在集成環(huán)境中設(shè)置命令行參數(shù),9.5 指向指針的指針(二級間接訪問) 指向指針的變量稱為指針的指針。 其定義的一般格式:類型說明符 *指針變量名,int x=3, *p1, *p2; p1 = ,一級間接訪問 x

44、: *p1 二級間接訪問 x: *p2;,例9.32 void main( ) char *p ; char *s = up, down, left, right ; int i ; p=s ; for( i=0; i4; i+ ) cout *p+ t; ,運行結(jié)果:up down left right,圖,指針數(shù)組名本質(zhì)上就是指向指針的指針。,1. 函數(shù)指針的定義和說明 一個函數(shù)被編譯后生成一段二進制代碼,該段代碼的首地址稱為函數(shù)的入口地址,即函數(shù)指針。 C+將函數(shù)名的值處理成函數(shù)的入口地址,函數(shù)名即函數(shù)指針。 可以定義一個指針變量,用于存放函數(shù)的入口地址,該指針稱為函數(shù)指針變量。,9.6

45、 指針和函數(shù) 9.6.1 函數(shù)指針,例: int (*fp)(int,int); 定義函數(shù)指針 fp 指向具有兩個 整型參數(shù),并且返回值為整型數(shù)據(jù)的函數(shù)。 int max(int,int); 說明函數(shù) max。 fp=max ; 將函數(shù) max 的入口地址賦給指針變量fp, fp 和 max 都指向函數(shù)的入口, 即fp 和 max 的值都是函數(shù)的入口地址。, 函數(shù)指針定義格式: 類型說明符 (*函數(shù)指針名)(參數(shù)類型表);,void main( ) int max(int,int); / 函數(shù)原型說明 int (*fp)(int, int); / 定義函數(shù)指針 fp fp = max; int

46、 max(int x,int y) return(xy?x:y); ,函數(shù)指針變量的意義,max 的值為 2000! fp 是一個變量! fp 得到的值也是2000!,函數(shù)可以通過函數(shù)名調(diào)用,也可通過函數(shù)指針調(diào)用。 如果 fp=max,則對函數(shù) max 的調(diào)用方式是: max(實參表); / 通過函數(shù)名調(diào)用 fp(實參表); / 通過函數(shù)指針調(diào)用 (*fp)(實參表);/ 通過函數(shù)指針調(diào)用,2. 函數(shù)指針的使用,void main( ) int max(int,int),min(int,int); / 函數(shù)原型說明 int (*fp)(int, int); / 定義函數(shù)指針 fp int a,

47、b,c,d; cin a b ; fp=max; / fp 指向 max( ) 函數(shù) c=fp(a,b); / 通過 fp 調(diào)用 max( ) 函數(shù) fp=min; / fp 指向 min( ) 函數(shù) d=(*fp)(a,b); / 通過 fp 調(diào)用 min( )函數(shù) couty?x:y); int min(int x,int y) return(xy?x:y); ,例9.33 通過函數(shù)指針調(diào)用函數(shù),例9.34函數(shù)名做參數(shù),通過一個公用接口調(diào)用三個函數(shù) void main( ) int max(int,int),min(int,int),add(int,int); int process(in

48、t, int, int (*)(int,int); int a,b ; cout a b ; cout “max=” process(a,b,max) endl; cout “min=” process(a,b,min) endl; cout “sum=” process(a,b,add) endl; int process(int x,int y, int (*fun)(int,int) return fun(x,y); ,例9.34 續(xù) int max(int x, int y) return( xy ? x :y ); int min(int x, int y) return( xy ?

49、 x :y ); int add(int x, int y) return( x + y ); ,運行時:輸入 4 8 輸出 max=8 min=4 sum=12,例9.35 編寫一個通用的積分函數(shù)求下列三個定積分的近似值 用梯形法求定積分的通用公式為:,#include 例9.35 #include double f1(double x) return(sin(x)+1); double f2(double x) return(1 + x + x*x + x*x*x); double f3(double x) return x/(1+x*x); /通用的求積分函數(shù) double integr

50、al(double(*f)(double),double a,double b,int n ) double s, h; int i; h=(ba)/n; s=(f(a)+f(b)/2; for(i=1; in; i+) s+=f(a+i*h); return(s*h); ,void main( ) 例9.35 coutf1積分值:integral(f1, 0, 1, 3000)endl; coutf2積分值:integral(f2, 0, 2, 1000)endl; coutf3積分值:integral(f3, 1, 2.5, 2000)endl; 程序運行結(jié)果: f1積分值:1.4597

51、f2積分值:10.6667 f3積分值:0.643927,9.6.2 返回指針值的函數(shù)(指針函數(shù)),通常 int f1( ); 返回 int 型數(shù) float f2( ); 返回 float 型數(shù) char f3( ); 返回 char 型數(shù),有時需要一個函數(shù)的返回值為指針, 稱該函數(shù)為指針型函數(shù)。 定義指針型函數(shù)的格式: 類型說明符 *函數(shù)名(參數(shù)表) 函數(shù)體 ,例 :int * f1( ); 返回 int 型指針 float * f2( ); 返回 float 型指針 char * f3( ); 返回 char 型指針,#include char *find(char *str, char

52、 c) while(*str!=0) if(*str=c) return(str); else str+; return(NULL); /若找不到,返回空指針 void main( ) char s =warrior; char *p; p=find(s, r); if(p) cout p endl; p=find(s, i); if(p) cout p endl; p=find(s, b); if(p) cout p endl; ,例9.36在一個字符串中找出某個字符第一次出現(xiàn)時的地址,/ 輸出 rrior / 輸出 ior / 不輸出,9.7 指針小結(jié): int *p; 一般指針,可與一維

53、數(shù)組名等價。 int (*p)M; 指向含有 M 個元素的一維數(shù)組, 可與二維數(shù)組名等價。 int *pM; 指針數(shù)組,有M個元素,每個元素都是指針。 int *p; 指向指針的指針。 int (*p)(int, int); 函數(shù)指針,指向參數(shù)是兩個整型值、 并且返回整型值的函數(shù)。 int *p( ). 返回整型指針值的函數(shù)。,9.8 引用和其他類型的指針 9.8.1 引用類型變量的說明及使用,例:int a; int ,意義:給變量 a 定義了一個別名 ref 。,例:int a; int ,輸出:88 1010,例9.37 為指針類型變量定義引用 #include void main( )

54、 int a; int *p= 程序運行后,輸出: 8, 8, 8,除了基本類型的變量可以定義引用外, 指針類型也可以定義引用。,注意事項:,一個變量可定義多個引用: int i; int ,可定義引用的引用: int i; int ,不能為數(shù)組名定義引用,但可為數(shù)組元素定義引用 int a10; int * ref2 a5,9.8.2 引用和函數(shù) 引用類型變量主要用作函數(shù)參數(shù),1基本類型變量和指針變量做函數(shù)參數(shù) 回顧一下用基本類型變量和指針變量做函數(shù)參數(shù) 的兩個例子:,例9.7 基本類型量做函數(shù)參數(shù) #include void swap(int x, int y) int t ; t = x

55、 ; x = y ; y = t ; void main( ) int x=3, y=9; swap(x, y); cout x , y endl; 程序運行后,輸出:3, 9,例9.8 指針做函數(shù)參數(shù) #include void swap(int *px, int *py) int t ; t=*px ; *px=*py ; *py= t; void main( ) int x=3, y=9, *p1, *p2; p1= 程序運行后,輸出:9, 3,2引用類型做函數(shù)參數(shù) 例9.38 引用類型做函數(shù)參數(shù) #include void swap(int 程序運行后,輸出:9, 3。,9.8.3 const類型量,1. 定義const類型量,const int MaxLine=1000; / 定義時,必須賦初值 const float PI=3.14;,程序運行過程中,不允許 MaxLine = ;,與符號常量的區(qū)別:( #define PI 3.14 /定義符號常量 ),符號常量由

溫馨提示

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

評論

0/150

提交評論