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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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 引用、const型變量和const型指針 9.9 存儲空間的動態(tài)分配和釋放 9.10 鏈表及其應(yīng)用 9.11 用typedef定義新類型名, 內(nèi)存中的一個字節(jié)為一個存儲單元( Byte)。 存儲單元的編號稱為地址。 變量的地址是指該變量所在存儲區(qū)域的第一個 字節(jié)(單元)的地址。,9.1 指針和指針變量 9.1.1 指針的概念,例:int a; float b; char c;,這三個地址

2、就稱為變量a、b、c的指針。,指針也是一個數(shù)值, C+提供了一種類型的變量用于存放地址值, 即存放指針,這種變量就是指針變量。,9.1.2 指針變量的定義,指針變量的定義格式:類型說明符 *指針變量名;,例:int *pi ; 定義 pi 為指向 int 類型變量的指針變量 float *pf ; 定義 pf 為指向 float 類型變量的指針變量,int * 為int型指針類型標識符。 float * 為float型指針類型標識符。,幾點說明: 一個指針變量只能指向同一數(shù)據(jù)類型的變量,該 數(shù)據(jù)類型是在定義指針變量時明確給定的。 C+語言規(guī)定有效數(shù)據(jù)的指針不指向0單元(為非0值), 如果指針變

3、量值為0,即NULL(在ios.h中已定義), 表示空指針,即不指向任何變量。 不要把地址值與整數(shù)類型值相混淆。 例如:地址2000與整型量2000是兩個不同的概念。,1、 /將整型變量 m 的地址值賦給指針變量 p,9.1.3 有關(guān)指針的運算符 p= 將 100 賦給指針變量 p 所指向的變量 m,n,9.1.4 指針變量的初始化 初始化格式:類型說明符 *指針變量名=初始地址值 ; 例:char c, *p1 ; p1=/* 指針初始化,定義時進行 */,兩種方式等效,9.1.5 直接訪問和間接訪問,在C+中定義的所有變量,編譯器都會記錄它們的屬性, 便于以后對它們的訪問, 如在例9.1中

4、定義的兩個變量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,間接存取的前提是什么?,總結(jié): char *cp= ,輸出:? AA BB aa,例9

5、.4 變量的直接訪問和間接訪問 int a=1; float b=5.2; char c=A; int *p1; float *p2; char *p3; p1=,運行結(jié)果:?,1, 5.2, A 1, 5.2, A,續(xù):*p1=*p1+1; *p2=*p2+2; *p3=*p3+3; cout a , b , c endl;,運行結(jié)果:?,2, 7.2, D,關(guān)于指針使用的幾點說明: 指針變量必須通過初始化或賦值獲得值后(即必須明確指向某一變量),才可以利用它進行間接訪問。 若有 int m ; int *p = 是無意義的。,關(guān)于指針使用的幾點說明(續(xù)): 同類型指針變量之間可以相互賦值,

6、不同類型的指針變量一般不能相互賦值,如在例9.4中,若出現(xiàn) p1 = p2 ; 是無意義的。 允許將一個整型常數(shù)經(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 通過指針,交換兩個指針所指向的變量的值,int x=10, y=20,t; int *p1 =,cout x ,

7、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, *p1; float b, *p2; double d, *p3; p1= ,輸出結(jié)

8、果: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 /復習 void main( ) int x=10, y ; int *p1= ,例9.8 基本類型量作函數(shù)參數(shù) #include void swap(int x,int y) int t; t=x; x=y; y=t; void main( ) int x

9、=3, y=9; swap(x,y); cout x , yendl; 輸出?,局部動態(tài)變量,3,9,main( ) 工作區(qū),swap1( ) 工作區(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 x=3,y=9,*p1,*p2; p1= 輸出?,局部動態(tài)變量,9,3,指針作為函數(shù)參數(shù), 可以

10、改變主調(diào)函數(shù)中 變量的值。,main( ) 工作區(qū),swap2( ) 工作區(qū),參數(shù)傳遞時, 有:int *px=p1; int *py=p2;,被調(diào)函數(shù)中參數(shù)的指針,相當于一只手,9.2.2 指針變量作函數(shù)參數(shù),假定: 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;

11、/ 假定a的值為1040 int *p; / p是指向整型變量的指針, a數(shù)組的元素為整型變量, 那么 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 是

12、 int 型指針,則 c 等于 4 若 p 是 char 型指針,則 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)piai for( i=0; i10; i+, p+) / 指針變量可進行自加、自減運算 cout *p; cout sum= sum endl; ,指向

13、相同數(shù)據(jù)類型的指針變量可以相減,其結(jié)果 為兩指針所指向地址之間數(shù)據(jù)的個數(shù)。,例:int *px ,*py ,n ,a5 ; px=,(2)指針 - 指針 運算的意義,結(jié)果:n 值為3,= != =,(3)指針 比較 指針,指針的關(guān)系運算是兩個指針所指向的地址之間的 比較運算,產(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的地址是否比p2的地址??? 結(jié)果:1, p1

14、!=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+) sum = sum + *p ; for(p = a ; p a+10; p+) / 需重新給 p 賦初值 cout *p; cout sum= sum endl; ,以上定義等價于: int a10,*p; p=a ;,例:int a10,*p ; p=, int a10; int *p

15、=, int a10; int *p=a ;,a p+ ; 正確 a=p+2; a+ ;錯誤,a+i,例9.12 P179 數(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 reverse(int b , int n) int i,

16、 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是一個指針。,實參 a,main( ) 函數(shù)存儲區(qū)內(nèi)容,程序,例9.14將數(shù)組元素逆向存放。(

17、續(xù)),*(b+0) *(b+1) *(b+2) . *(b+8) *(b+9) b0 b1 b2 . b8 b9 b+;,reverse( ) 函數(shù)存儲區(qū)內(nèi)容,在 reverse( ) 函數(shù)中, 將 b 處理成一個 int 型指針, (相當于:int *b) 通過指針 b 訪問 a 數(shù)組中內(nèi)容。,被調(diào)函數(shù)中參數(shù)的指針,相當于一只手,void reverse(int b , int n) / b是一個指針變量 int i, j, t; i=0; j=n-1; while(ij) t=*(b+i); *(b+i)=*(b+j); *(b+j)=t; i+; j- -; / 原 t=bi; bi=b

18、j; bj=t; ,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ù)組元素逆向存放。( 改寫 ), 一維數(shù)組名作函數(shù)參數(shù) 實參和形參的各種寫法,void f( int b , int n ) . bi /或 *( b+i ) void main(void) int a10, *p; p=a; f( a , 10 ); ,例9.15分別求數(shù)組前十個元素和后十個元素之和,int fsum(int *array,int

19、n) int i,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 =

20、array + 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是一維字

21、符數(shù)組名,即起始地址。 字符數(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

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

23、nclude void main( ) char a20=“ABCD”, b10=“EFG”; int i, j; i = strlen(a); / i是字符串a(chǎn) 結(jié)尾0的下標 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指向

24、a尾部的0 while(*pb!=0) *pa=*pb; pa+; pb+; *pa=0; pa=a; cout pa endl ; ,2.字符串指針作函數(shù)參數(shù) 例9.19 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_strcmp(char *s,

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

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

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

28、素的訪問方法 for(i=0; i3; i+) for(j=0; j4; j+) sum += *(*(a+i)+j); /B cout sum endl; ,2. 指向一維數(shù)組的指針變量(行指針) 例:int (*p)4; int a34;,注意:數(shù)組名 a 和 p 同為行指針,但 a 是指針常量, 而 p 是指針變量。,定義一個行指針p,指向一維數(shù)組,該一維數(shù)組 包含4個整型數(shù)值(相當于二維數(shù)組的一行元素)。,p=a ; / p和a的類型一樣,類型為 int(*)4,比較: 與一維數(shù)組名等價的指針變量(指向數(shù)組元素的指針) int a10, *p; / 類型是 int * p=a; 與二維

29、數(shù)組名等價的指針變量(指向一維數(shù)組的指針) int a34; int (*p)4; p=a; / 類型是 int (*)4,例:輸出一個指定行、列下標的二維數(shù)組元素值 void main( ) int a34=.; int (*p)4, i, j; p=a; cin i j; /輸入行標、列下標 cout a i j = *(*(p+i)+j) endl; ,例9.24 求二維數(shù)組全體元素之和 int total(int(*p)4, int n) /n 行數(shù) int i,j, sum=0; for( i=0 ;i *(ai+j); sum = total( a, 3 ); cout sum e

30、ndl; ,3. 二維數(shù)組名作函數(shù)參數(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 void main( ) int a34; f(a); ,4、將二維數(shù)組看成一維數(shù)組訪問 (1) 通過元素指針訪問二維數(shù)組元素 例9.25 輸出二維數(shù)組全體元素的值。 vo

31、id 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,例9.26 編寫通用二維數(shù)組輸出函數(shù)。,void print(int *p, int row, int col) int i; for(i=0; irow*col; i+, p+) if(i%col=0) coutn; coutsetw(4) *p; coutn; void main(void) int a34=1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

32、 11, 12; int b23=1, 2, 3, 4, 5, 6; print(a0, 3, 4); print(b0, 2, 3); ,(2)已知一個二維數(shù)組為N行M列,即aNM, 將二維數(shù)組看成一維數(shù)組后, 求aij放在第幾個位置?,二維數(shù)組按行存放, aij的前面有 i*M+j 個元素, 若序號從0開始, 則aij的序號是:i*M+j,若 int *p=a0; 則 p+i*M+j 是aij的地址。,void f( int b 4 ) . *(*(b+i)+j) bij void main( ) int a34; f(a); ,解釋二維數(shù)組作參數(shù)時,參數(shù)第一維可缺省原因,例9.27 輸入

33、二維數(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.3.5 獲得函數(shù)處理結(jié)果的幾種方法 1、利用return語句返回值 (只能返回一個值) 例:int min(int a, int b) return(ab)?a:b); ,2、利用全局變量得到函數(shù)調(diào)用結(jié)果 (安全性欠佳) 例:int max, min ; /可得到多個結(jié)果 void fun(int a, int b) max=(ab)?a:b ; min=(a

34、b)?a:b ; void main( ) fun(5, 8); coutmax,minendl; ,3、利用指針變量作為函數(shù)參數(shù)來取得函數(shù)調(diào)用的結(jié)果。 (較好,可安全地得到多個結(jié)果值) 涉及參數(shù)空間的分配 (1)普通變量指針作參數(shù) 例:void fun(int a, int b, int *pmax, int *pmin) *pmax=(ab)?a:b ; *pmin=(aab; fun(a, b, ,(2)數(shù)組名作參數(shù) 數(shù)組名作參數(shù)時,傳遞的是數(shù)組首地址, 在被調(diào)函數(shù)中可以通過首指針訪問數(shù)組元素, 本質(zhì)上與普通變量指針作參數(shù)是一樣的?;仡櫪?.14 void reverse( int b

35、, int n ) 等價于 int *b, int n int t; int *p2 = b+n-1; 下頁圖 while(b p2) t = *b; *b = *p2; *p2=t; b+; p2- ; 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 ; ,實參 a,main( ) 函數(shù)局部變量,reverse( ) 函數(shù)局部變量,4、利用引用作為函數(shù)參數(shù)來取得函數(shù)調(diào)用的結(jié)果 (較好,可安全地得到多個結(jié)果值) 不涉及參數(shù)空間的分配

36、例:void fun(int a, int b, int ,形參變量是實參的別名, 使用起來較方便、直觀。,9.4 指針數(shù)組,數(shù)組元素 的值為:,數(shù)組元素值為指針的數(shù)組稱為指針數(shù)組,9.4.1 指針數(shù)組的定義和使用,1. 基本概念,2. 指針數(shù)組的定義和說明 定義格式:類型說明符 *指針數(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.28利用指針數(shù)組輸出另一個數(shù)組中各元素的值 。

37、#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ù)組 ) for(i=0;i3;i+) pi=ai;,說明:p 數(shù)組的三個元素 分別是指向整型變量的指 針(元素指針)。,例9.29輸出二維數(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 *(p

38、ai+j) t; cout n; 運行結(jié)果:1 2 3 4 5 6,9.4.3 利用字符指針數(shù)組處理字符串,char *name =George, Mary, Susan, Tom, Davis;,括號中的每一個字符串都是一個地址值。,#include #include void main( ) char *name = George, Mary, Susan, Tom, Davis ; char *ptr; int i, j, k, n=5;,例9.30 按字典序?qū)⑸鲜?個字符串排序,輸出。 此程序主算法是選擇法排序, 通過交換指針的指向來達到排序的目的。,for(i=0; i0 ) /字符

39、串比較, k=j; /記住最小字符串指針的下標。 if(k!=i) ptr=namei; namei=namek; namek=ptr; /交換指針數(shù)組元素值 for(i=0; in; i+) /輸出結(jié)果 cout namei endl; ,結(jié)果指針的指向:,運行結(jié)果是: Davis George Mary Susan Tom,指針數(shù)組元素指向的是字符串常數(shù), 每個字符串的長度都不一樣, 所以只能通過交換指針的指向 實現(xiàn)排序。,例9.31改寫例9.30,學習如何使用指針數(shù)組作函數(shù)參數(shù)。 #include #include void main( ) void sort(char * , int)

40、, print(char * , int); /函數(shù)原型說明,因為函數(shù)定義在后 char *name =George, Mary, Susan, Tom, Davis; int n=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ù)的寫

41、法 for(int i=0; in; i+) cout namei endl; ,(1)int *p; 一般指針,可與一維數(shù)組名等價。 如有:int a10; p=a; 可用pi訪問數(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個元素, 每個元素

42、都是指針,即有M個指針。,如何訪問ai?,9.4.4 指針數(shù)組作 main 函數(shù)的形參 main( )函數(shù)的參數(shù)格式: void main(int argc, char *argv ) . ,形參argc:命令行中參數(shù)的個數(shù) 形參argv:指針數(shù)組的各元素分別指向命令行中 各字符串的首地址。,例9.32 了解 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; ,源程序文件

43、名: Li0932.cpp 源程序文件存放位置: D:cpp 可執(zhí)行程序位置: D:cppDebug 可執(zhí)行程序文件名: Li0932.exe,(1)通過DOS命令行執(zhí)行程序,程序的一種執(zhí)行方式,命令行: D:cppDebug Li0932 par1 par2 /p /w ,Project | Settings | Debug | Program arguments,該程序運行后的結(jié)果如下: argc=5 Command name=D:cppDebugLi0932.exe par1 par2 /p /w,演示在集成環(huán)境和 DOS環(huán)境中的運行情況,(2)在集成環(huán)境中設(shè)置命令行參數(shù),main 函數(shù)

44、參數(shù)的意義,9.5 指向指針的指針(二級間接訪問) 指向指針的變量稱為指針的指針。 其定義的一般格式:類型說明符 *指針變量名,int x=3, *p1, *p2; p1=,一級間接訪問 x: *p 二級間接訪問 x: *p1;,例9.33 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ù)被編譯后生成一段二進制代碼

45、,該段代碼的首地址稱為函數(shù)的入口地址,即函數(shù)指針。 C+將函數(shù)名的值處理成函數(shù)的入口地址,函數(shù)名即函數(shù)指針。 可以定義一個指針變量,用于存放函數(shù)的入口地址,該指針稱為函數(shù)指針變量。,9.6 指針和函數(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ù)指針名)(

46、參數(shù)類型表);,void main( ) int max(int,int); / 函數(shù)原型說明 int (*fp)(int, int); / 定義函數(shù)指針 fp fp = max; int 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ù)指針的使

47、用,void main( ) int max(int,int),min(int,int); / 函數(shù)原型說明 int (*fp)(int, int); / 定義函數(shù)指針 fp int a,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.34 通過函數(shù)指針變量調(diào)用函數(shù),例9

48、.35函數(shù)名作參數(shù),通過一個公用接口調(diào)用三個函數(shù) void main( ) int max(int,int),min(int,int),sum(int,int); int process(int, 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,sum) endl; int process(int x,int y, int (*fun)(int,int) return

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

50、le x) return(1 + x + x*x + x*x*x); double f3(double x) return x/(1+x*x); /通用的求積分函數(shù) double integral(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.36 coutf1積分值:integral(f1, 0, 1, 3000)endl; coutf2積

51、分值:integral(f2, 0, 2, 1000)endl; coutf3積分值:integral(f3, 1, 2.5, 2000)endl; 程序運行結(jié)果: f1積分值:1.4597 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( ); 返回 i

52、nt 型指針 float * f2( ); 返回 float 型指針 char * f3( ); 返回 char 型指針,#include char *find(char *str, char ch) while(*str!=0) if(*str=ch) 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(

53、p) cout p endl; ,例9.37在一個字符串中找出某個字符第一次出現(xiàn)時的地址,/ 輸出 rrior / 輸出 ior / 不輸出,9.7 指針小結(jié): int *p; 一般指針,可與一維數(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 引用類型變量的說明及使用,例:i

54、nt a; int ,意義:給變量 a 定義了一個別名 ref 。,例:int a; int ,輸出:88 1010,例9.38 為指針類型變量定義引用 #include void main( ) 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基本類型變量和指針變量作

55、函數(shù)參數(shù) 回顧一下用基本類型變量和指針變量作函數(shù)參數(shù) 的兩個例子:,例9.8 基本類型量作函數(shù)參數(shù) #include void swap(int x, int y) int t ; t = x ; x = y ; y = t ; void main( ) int x=3, y=9; swap(x, y); cout x , y endl; 程序運行后,輸出:3, 9,例9.9 指針作函數(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.39 引用類型作函數(shù)參數(shù) #include void swap(int 程序運行后,輸出:9, 3。,程序運行過程中,不允許 MaxLine = ;,9.8.3 const類型量,1. 定義const型變量,const int MaxLine=1000; / 定義時,必須賦初值 const fl

溫馨提示

  • 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

提交評論