C程序設(shè)計(jì)學(xué)習(xí)教案_第1頁
C程序設(shè)計(jì)學(xué)習(xí)教案_第2頁
C程序設(shè)計(jì)學(xué)習(xí)教案_第3頁
C程序設(shè)計(jì)學(xué)習(xí)教案_第4頁
C程序設(shè)計(jì)學(xué)習(xí)教案_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、會(huì)計(jì)學(xué)1C程序設(shè)計(jì)程序設(shè)計(jì)第一頁,編輯于星期六:四點(diǎn) 二分。第1章 C語言概述第2章 基本數(shù)據(jù)類型和運(yùn)算第3章 結(jié)構(gòu)化程序設(shè)計(jì)第5章 函數(shù)第6章 指針第7章 復(fù)合結(jié)構(gòu)類型第8章 編譯預(yù)處理第4章 數(shù)組及字符串 附錄6.1 指針的基本概念6.2 指針變量的運(yùn)算6.3 指向數(shù)組元素的指針6.4 指向多維數(shù)組的指針變量6.5 指向字符串的指針變量6.6指針型函數(shù)6.7指針數(shù)組6.8二級指針6.9程序舉例6.10用指針進(jìn)行內(nèi)存動(dòng)態(tài)分配6.11指針數(shù)據(jù)類型的總結(jié) 第9章 位運(yùn)算第10章 文件第1頁/共68頁第二頁,編輯于星期六:四點(diǎn) 二分。指針教學(xué)目標(biāo) 掌握指針的概念和運(yùn)算規(guī)則 掌握用指針訪問變量、一維

2、數(shù)組和二維數(shù)組 用指針處理字符串的方法第2頁/共68頁第三頁,編輯于星期六:四點(diǎn) 二分。6.1 指針的基本概念1. 指針的概念 2. 指針變量內(nèi)存單元的編內(nèi)存單元的編號(hào)叫做地址,號(hào)叫做地址,通常也把這個(gè)通常也把這個(gè)地址稱為地址稱為“指指針針”。第3頁/共68頁第四頁,編輯于星期六:四點(diǎn) 二分。6.1 指針的基本概念1. 指針的概念 2. 指針變量在語言中,在語言中,允許用一個(gè)變允許用一個(gè)變量來存放指針,量來存放指針,這種變量稱為這種變量稱為“指針變量指針變量”。第4頁/共68頁第五頁,編輯于星期六:四點(diǎn) 二分。1. 定義的一般格式 2. 舉例說明6.1 指針的基本概念存儲(chǔ)類型 類型說明符 *變

3、量名;其中,“*”表示這是一個(gè)指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。一個(gè)指針變量只能指向同一種類型的變量,也就是說,不能定義一個(gè)既指向一個(gè)整型變量又指向一個(gè)雙精度型變量的指針變量。第5頁/共68頁第六頁,編輯于星期六:四點(diǎn) 二分。1. 定義的一般格式 2. 舉例說明6.1 指針的基本概念例如:int *m1;表示m1是一個(gè)指針變量,它的值是某個(gè)整型變量的地址;或者說m1指向一個(gè)整型變量。至于m1究竟指向哪一個(gè)整型變量,應(yīng)該由指向m1賦予的地址來決定。再例如:static int *m2; /* m2是指向是指向靜態(tài)整型變量的指針變量靜態(tài)整型變量的

4、指針變量*/float *m3; /* m3是指向浮點(diǎn)是指向浮點(diǎn)型變量的指針變量型變量的指針變量*/char *m4; /* m4是指向字符型變是指向字符型變量的指針變量量的指針變量*/ 第6頁/共68頁第七頁,編輯于星期六:四點(diǎn) 二分。1. 變量地址表示方法 2. 給指針變量賦地址的方法語言提供了地址運(yùn)算符“&”,表示變量地址的一般形式為:&變量名變量名;如:&a表示變量a的地址,&b表示變量b的地址。6.1 指針的基本概念3. 例第7頁/共68頁第八頁,編輯于星期六:四點(diǎn) 二分。1. 變量地址表示方法 (1)指針變量初始化的方法。int a; /*定義整型變

5、量定義整型變量a*/ int *p=&a; /*定義指定義指針針p,并將變量,并將變量a的地的地址賦給指針址賦給指針p*/(2)賦值語句的方法。int a; /*定義整型變定義整型變量量a*/ int *p; /*定義指針定義指針p*/ p=&a; /*將變量將變量a的地址賦給指針的地址賦給指針p*/6.1 指針的基本概念2. 給指針變量賦地址的方法3. 例第8頁/共68頁第九頁,編輯于星期六:四點(diǎn) 二分。1. 變量地址表示方法 【例6.1】用指針變量訪問變量中的數(shù)據(jù)。#includemain() int a,*p; /*定義整型變量a和整型變量指針p*/p=&a; /

6、*指針p指向變量a*/printf(please enter a number:n,*p);scanf(%d,p); /*為指針p所指的存儲(chǔ)單元輸入數(shù)值*/printf(%dn,*p); /*輸出指針p所指的存儲(chǔ)單元的內(nèi)容*/6.1 指針的基本概念2. 給指針變量賦地址的方法3. 例1501000ap1000100120002001第9頁/共68頁第十頁,編輯于星期六:四點(diǎn) 二分。2. 取內(nèi)容運(yùn)算符*3. 注意事項(xiàng)取地址運(yùn)算符“&”是單目運(yùn)算符,其結(jié)合性為自右至左,功能是取變量的地址。在scanf函數(shù)中,我們已經(jīng)認(rèn)識(shí)并使用了&運(yùn)算符。1. 取地址運(yùn)算符&6.2.1 指針

7、運(yùn)算符指針運(yùn)算符6.2 指針變量的運(yùn)算第10頁/共68頁第十一頁,編輯于星期六:四點(diǎn) 二分。2. 取內(nèi)容運(yùn)算符*3. 注意事項(xiàng)取內(nèi)容運(yùn)算符“*”是單目運(yùn)算符,其結(jié)合性為自右至左,通過“*”可以存取指針?biāo)傅拇鎯?chǔ)單元的內(nèi)容。在“*”運(yùn)算符之后跟的變量必須是指針變量。需要注意的是指針運(yùn)算符“*”和指針變量說明中的指針說明符“*”不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達(dá)式中出現(xiàn)的“*”則是一個(gè)運(yùn)算符,用以表示指針變量所指的內(nèi)容。1. 取地址運(yùn)算符&6.2.1 指針運(yùn)算符指針運(yùn)算符6.2 指針變量的運(yùn)算第11頁/共68頁第十二頁,編輯于星期六:四點(diǎn) 二

8、分。2. 取內(nèi)容運(yùn)算符*3. 注意事項(xiàng)【例6.2】分析下面程序的運(yùn)行結(jié)果。#includemain()int d,x,*p; /*定義整型變量d、x和整型指針p*/d=10;x=19;p=&x; /*將變量x的地址賦給指針p*/printf(d=%dn,*p);1. 取地址運(yùn)算符&6.2.1 指針運(yùn)算符指針運(yùn)算符6.2 指針變量的運(yùn)算程序的運(yùn)行結(jié)果如下:d=19第12頁/共68頁第十三頁,編輯于星期六:四點(diǎn) 二分。2. 取內(nèi)容運(yùn)算符*3. 注意事項(xiàng)(1)取地址運(yùn)算符&表示變量的地址;而取內(nèi)容運(yùn)算符*表示指針?biāo)傅膬?nèi)容。(2)運(yùn)算符&只能用于變量和數(shù)組元素。(3)

9、*和&都是單目運(yùn)算符,兩者的優(yōu)先級相同,結(jié)合性均是從右到左。(4)&x不能出現(xiàn)在賦值號(hào)的左邊。(5),因此不能用&取寄存器變量的地址。(6)被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯(cuò)誤的。1. 取地址運(yùn)算符&6.2.1 指針運(yùn)算符指針運(yùn)算符6.2 指針變量的運(yùn)算第13頁/共68頁第十四頁,編輯于星期六:四點(diǎn) 二分。2. 取內(nèi)容運(yùn)算符*3. 注意事項(xiàng)【例6.3】通過指針變量訪問字符型變量。#includemain() char ch1,ch2;/*定義字符型變量ch1和ch2*/ char *p1,*p2; /*定義字符型指針p1和p

10、2*/ ch1=A; ch2=B; p1=&ch1; /*指針p1指向變量ch1*/ p2=&ch2; /*指針p2指向變量ch2*/ printf(%c,%cn,ch1,ch2);/*輸出變量ch1和變量ch2的內(nèi)容*/ printf(%c,%c,*p1,*p2); /*輸出指針p1和p2所指的存儲(chǔ)單元的內(nèi)容*/1. 取地址運(yùn)算符&6.2.1 指針運(yùn)算符指針運(yùn)算符6.2 指針變量的運(yùn)算程序的運(yùn)行結(jié)果為:A,BA,B&ch1&ch2P1P2ch1ch2(a) p1與ch1之間的關(guān)系(b) p2與ch2之間的關(guān)系第14頁/共68頁第十五頁,編輯于星期六:四

11、點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算(1)指針變量初始化賦值時(shí),不要將一個(gè)內(nèi)存地址常量賦給一指針變量。例如:int i=100, x;int *m;:m=&i;1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算4. 兩指針變量相減第15頁/共68頁第十六頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算(2)指針變量和一般變量一樣,存放在其中的值是可以改變的,也就是說可以改變指針變量的指向,例如:int i, j;int *p1;int *p2;i=c;j=d;p1=&i;p2=&j;上面的程序語句也可以用下面的圖來

12、說明。1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算賦值運(yùn)算結(jié)果4. 兩指針變量相減第16頁/共68頁第十七頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算如果此時(shí)有如下的賦值表達(dá)式:p2=p1;則指針變量p2與p1就指向了同一個(gè)對象i,此時(shí)的*p2就等價(jià)于i,而不再是j了,這種情況可以用如下的圖來說明。1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算p2=p1時(shí)的情形P1P24. 兩指針變量相減第17頁/共68頁第十八頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算再例如,如果執(zhí)行如下的表達(dá)式:*p2=*p1;

13、則此時(shí)表示把p1指向的內(nèi)容賦給p2所指的區(qū)域,此時(shí)可用下圖來表示情形。 1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算*p2=*p1時(shí)的情形P1P24. 兩指針變量相減第18頁/共68頁第十九頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算(3)如果需要,也可以把數(shù)組的首地址賦予指向數(shù)組的指針變量。例如:int a8,*pa;pa=a; 也可寫為:也可寫為:pa=&a0; 也可采取如下初始化賦值的方法:也可采取如下初始化賦值的方法:int a8,*pa=a;1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算4. 兩指針變量相減第19

14、頁/共68頁第二十頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算(4)可以把字符串的首地址賦給指向字符類型的指針變量。例如,把字符串“Hello human”賦給指針變量p,方法如下:char *p;p=Hello human;或用初始化賦值的方法寫為:char *p=Hello human;1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算4. 兩指針變量相減第20頁/共68頁第二十一頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算對于指向數(shù)組的指針變量,可以給其加上或減去一個(gè)整數(shù)n。例如,設(shè)p是指向數(shù)組m的指針變量,則p+n

15、,p-n,p+,+p,p-,-p都是合法的運(yùn)算表達(dá)式。給指針變量加上或減去一個(gè)整數(shù)n表示把指針指向的當(dāng)前位置(指向某數(shù)組元素)向前或向后移動(dòng)n個(gè)位置。1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算4. 兩指針變量相減第21頁/共68頁第二十二頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算3. 指針變量的關(guān)系運(yùn)算指向同一數(shù)組的兩個(gè)指針變量進(jìn)行關(guān)系運(yùn)算可表示它們所指數(shù)組元素之間的關(guān)系。例如:p1=p2; /*表示p1和p2指向同一數(shù)組元素*/p1p2; /*表示p1處于高地址位置*/p1y) /*三個(gè)數(shù)進(jìn)行大小比較*/max=&x; min=&y; elsema

16、x=&y;min=&x;if(z*max) max=&z;if(z*min) min=&z;printf(the max is: %dnthe min is: %dn,*max,*min);1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算該程序的運(yùn)行結(jié)果如下:please input three numbers:23 34 65 the max is: 65the min is: 23第23頁/共68頁第二十四頁,編輯于星期六:四點(diǎn) 二分。2. 指針中加減運(yùn)算4. 兩指針變量相減兩指針變量也可以進(jìn)行相減運(yùn)算,其所得之差是:兩個(gè)指針?biāo)傅臄?shù)組元素之間

17、相差的元素個(gè)數(shù),實(shí)際上是兩個(gè)指針值(地址)相減之差再除以該數(shù)組元素的長度(字節(jié)數(shù))。 例如:p1和p2 是指向同一整型數(shù)組的兩個(gè)指針變量,設(shè)p1的值為1100H,p2的值為1050H,由于整型數(shù)組每個(gè)元素占2個(gè)字節(jié),所以p1-p2的結(jié)果為(1100H-1050H)/2=25,因此“p1-p2”表示p1和 p2之間相差25個(gè)元素。但是,p1和p2不能進(jìn)行加法運(yùn)算,因?yàn)橹羔樧兞肯嗉邮呛翢o意義的。1. 賦值運(yùn)算6.2.2 指針變量的運(yùn)算6.2 指針變量的運(yùn)算3. 指針變量的關(guān)系運(yùn)算第24頁/共68頁第二十五頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)第一

18、,一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。其中的數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。第二,一個(gè)數(shù)組也是由各個(gè)數(shù)組元素組成的。第三,數(shù)組元素的首地址也是指它所占有的幾個(gè)內(nèi)存單元的首地址。1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針第25頁/共68頁第二十六頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)數(shù)組指針變量說明的一般形式為:類型說明符類型說明符 *指針變量名指針變量名;其中,“類型說明符”表示指針變量所指數(shù)組的類型;“*”表示其后的變量是指針變量。用數(shù)組指針變量訪問數(shù)組元素有兩種方法:第一種方法為下標(biāo)法,即用mi形式訪問數(shù)組元素。第二種方法

19、為指針法,即采用*(pm+i)形式,該方法是用間接訪問的方法來訪問數(shù)組元素。1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針第26頁/共68頁第二十七頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.6】采用指針法訪問數(shù)組元素。#includemain()int m5,i,*pm; pm=m; for(i=0;i5;i+) *pm=i; pm+; pm=m;for(i=0;i5;i+) printf(m%d=%dn,i,*pm); pm+; 1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針該程序的運(yùn)行結(jié)果如下:m0=0m1=1m2=2m3

20、=3m4=4第27頁/共68頁第二十八頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.7】與例6.6的本意相同,但是其實(shí)現(xiàn)方式不同。#includemain() int m5,i,*pm=m; for(i=0;i5;) *pm=i; printf(m%d=%dn,i+,*pm+); 1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針該程序的運(yùn)行結(jié)果如下:m0=0m1=1m2=2m3=3m4=4第28頁/共68頁第二十九頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)數(shù)組名是數(shù)組的首地址,實(shí)參向形參傳送

21、數(shù)組名實(shí)際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組的首地址,也可作為函數(shù)的參數(shù)使用。1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針第29頁/共68頁第三十頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.8】編寫求五門課程平均成績的函數(shù),并編寫主函數(shù)調(diào)用該函數(shù)。下圖所示為對應(yīng)的N-S流程圖。1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針定義浮點(diǎn)型的數(shù)組sco5、變量 av 和指針 *spsp=scofor(i=0;i5;i+)將5門課程的成績依次輸入到scoi中av=aver

22、(sp) 輸出平均分av的值main函數(shù)的N-S流程圖定義浮點(diǎn)型變量 av和 s for(i=0;i5;i+)s=s+*pm+av=s/5返回av的值aver函數(shù)的N-S流程圖第30頁/共68頁第三十一頁,編輯于星期六:四點(diǎn) 二分。2. 數(shù)組指針變量的說明3. 數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)程序代碼如下:#includefloat aver(float *pm); main() float sco5,av,*sp; int i; sp=sco; printf(n please input 5 scores:n); for(i=0;i5;i+) scanf(%f,&scoi); av=a

23、ver(sp); printf(average score is %5.2f,av); float aver(float *pm) /*函數(shù)aver*/ int i; float av,s=0; for(i=0;i5;i+) s=s+*pm+; av=s/5; return av;1.幾個(gè)數(shù)組指針變量的關(guān)系6.3 指向數(shù)組元素的指針程序的運(yùn)行結(jié)果如下:please input 5 scores:90 45 56 80 100 第31頁/共68頁第三十二頁,編輯于星期六:四點(diǎn) 二分。6.4 指向二維數(shù)組的指針變量1. 二維數(shù)組地址的表示方法 2. 二維數(shù)組的指針變量語言允許把一個(gè)二維數(shù)組分解為多

24、個(gè)一維數(shù)組來處理。因此二維數(shù)組m可分解為三個(gè)一維數(shù)組,即m0、m1、m2。每個(gè)一維數(shù)組又含有四個(gè)元素。例如m0數(shù)組,含有m00、m01、m02、m03四個(gè)元素。第32頁/共68頁第三十三頁,編輯于星期六:四點(diǎn) 二分。6.4 指向二維數(shù)組的指針變量1. 二維數(shù)組地址的表示方法 2. 二維數(shù)組的指針變量【例6.9】用不同的方式輸出同一數(shù)組元素的數(shù)據(jù)值的應(yīng)用舉例。#includemain() int m34=0,1,2,3,4,5,6,7,8,9,10,11; printf(%d,%d,%d,%d,%d,n,m,*m,m0,&m0,&m00); printf(%d,%d,%d,%d,

25、%d,n,m+1,*(m+1),m1,&m1,&m10); printf(%d,%d,%d,%d,%d,n,m+2,*(m+2),m2,&m2,&m20); printf(%d,%dn,m1+1,*(m+1)+1); printf(%d,%dn,*(m1+1),*(*(m+1)+1);其運(yùn)行結(jié)果如下:404,404,404,404,404412,412,412,412,412420,420,420,420,420414,4145,5第33頁/共68頁第三十四頁,編輯于星期六:四點(diǎn) 二分。6.4 指向二維數(shù)組的指針變量1. 二維數(shù)組地址的表示方法 2. 二維數(shù)組的

26、指針變量二維數(shù)組指針變量說明的一般形式為: 類型說明符 (*指針變量名)長度;其中“類型說明符”為所指數(shù)組的數(shù)據(jù)類型。“*”表示其后的變量是指針類型?!伴L度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長度,也就是二維數(shù)組的列數(shù)?!?(p+i)+j”是二維數(shù)組i行j 列的元素的地址,而“*(*(p+i)+j)”則是i行j列元素的值。第34頁/共68頁第三十五頁,編輯于星期六:四點(diǎn) 二分。6.4 指向二維數(shù)組的指針變量1. 二維數(shù)組地址的表示方法 2. 二維數(shù)組的指針變量【例6.10】二維數(shù)組指針變量的應(yīng)用舉例。main() static int m34=0,1,2,3,4,5,6,7,8,9,

27、10,11; int (*p)4; int i,j; p=m; for(i=0;i3;Ifor(j=0;j4;j+) printf(%3d ,*(*(p+i)+j);該程序的運(yùn)行結(jié)果為:0 1 2 3 4 5 6 7 8 9 10 11第35頁/共68頁第三十六頁,編輯于星期六:四點(diǎn) 二分。6.5 指向字符串的指針變量1. 字符串的表示形式2. 字符串指針變量與字符數(shù)組的區(qū)別在C語言中,可以用兩種方法訪問一個(gè)字符串。(1)第一種:用字符串指針指向一個(gè)字符串。(2)第二種:用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。第36頁/共68頁第三十七頁,編輯于星期六:四點(diǎn) 二分。6.5 指向字符串的指針

28、變量1. 字符串的表示形式2. 字符串指針變量與字符數(shù)組的區(qū)別【例6.11】編程實(shí)現(xiàn):把一個(gè)字符串的內(nèi)容復(fù)制到另一個(gè)字符串中,要求不能使用strcpy函數(shù)。函數(shù)cprstr的形參為兩個(gè)字符指針變量pm和pn。其中,pm指向源字符串,pn指向目標(biāo)字符串。這里要注意表達(dá)式“(*pn=*pm)!=0”的用法。程序代碼如下:#includecprstr(char *pm,char *pn) /*定義字符串復(fù)制函數(shù)cpystr*/ while(*pn=*pm)!=0)pn+;pm+; 第37頁/共68頁第三十八頁,編輯于星期六:四點(diǎn) 二分。6.5 指向字符串的指針變量1. 字符串的表示形式2. 字符串指

29、針變量與字符數(shù)組的區(qū)別main()char *pa=Human,b10,*pb;pb=b;cprstr(pa,pb); /*調(diào)用字符串復(fù)制函數(shù)cpystr*/printf(string_a=%snstring_b=%sn,pa,pb);程序的輸出結(jié)果為:string_a=Humanstring_b=Human第38頁/共68頁第三十九頁,編輯于星期六:四點(diǎn) 二分。6.5 指向字符串的指針變量1. 字符串的表示形式2. 字符串指針變量與字符數(shù)組的區(qū)別簡化后的程序如下所示:#includecprstr(char *pm,char *pn) while(*pn+=*pm+)!=0);main()ch

30、ar *pa=Human,b10,*pb;pb=b;cprstr(pa,pb); printf(string_a=%snstring_b=%sn,pa,pb);程序的輸出結(jié)果為:string_a=Humanstring_b=Human第39頁/共68頁第四十頁,編輯于星期六:四點(diǎn) 二分。6.5 指向字符串的指針變量1. 字符串的表示形式2. 字符串指針變量與字符數(shù)組的區(qū)別(1)在對字符數(shù)組作初始化賦值時(shí),必須采用外部類型或靜態(tài)類型。(2)字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中,并以0作為串的結(jié)束。(3)字符串指針方式可以根

31、據(jù)需要靈活使用。例如,對字符串指針方式:char *m=Hello Human;可以改寫為另一種方式:char *m;m=Hello Human;第40頁/共68頁第四十一頁,編輯于星期六:四點(diǎn) 二分。1. 定義的一般形式 2.例 6.6 指針型函數(shù)類型說明符 *函數(shù)名(形參表) 函數(shù)體其中函數(shù)名之前加了“*”號(hào)表明這是一個(gè)指針型函數(shù),即返回值將是一個(gè)指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。第41頁/共68頁第四十二頁,編輯于星期六:四點(diǎn) 二分。1. 定義的一般形式 2.例 6.6 指針型函數(shù)【例6.12】使用指針函數(shù)編寫程序,實(shí)現(xiàn)求兩個(gè)數(shù)中的較大者。#includeint *ma

32、x(int a,int b)int *p;if(ab)p=&a;elsep=&b;return p;main() printf(max=%d,*(max(12,56);第42頁/共68頁第四十三頁,編輯于星期六:四點(diǎn) 二分。1. 一般形式 2.例 6.6 指針型函數(shù)類型說明符 (*指針變量名)();上面就是函數(shù)指針變量定義的一般形式,其中“類型說明符”表示被指函數(shù)的返回值的類型?!?* 指針變量名)”表示“*”后面的變量是定義的指針變量。最后的空括號(hào)表示指針變量所指的是一個(gè)函數(shù)。例如: int (*f1)();表示f1是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型。3.幾點(diǎn)

33、注意事項(xiàng) 第43頁/共68頁第四十四頁,編輯于星期六:四點(diǎn) 二分。1. 一般形式 2.例 6.6 指針型函數(shù)【例6.13】編程實(shí)現(xiàn):求兩個(gè)整數(shù)中的較小者,在程序中使用指針形式實(shí)現(xiàn)對函數(shù)的調(diào)用。#includeint min(int a,int b) if(ab) return a;else return b;main()int min(int a,int b);int(*pmin)();int x,y,z;pmin=min; printf(please input two numbers:n);scanf(%d%d,&x,&y);z=(*pmin)(x,y); printf(m

34、in_number=%d,z);程序的運(yùn)行情況為:please input two numbers:3523min_number=233.幾點(diǎn)注意事項(xiàng) 第44頁/共68頁第四十五頁,編輯于星期六:四點(diǎn) 二分。1. 一般形式 2.例 6.6 指針型函數(shù)(1)函數(shù)調(diào)用中“(*指針變量名)”兩邊的括號(hào)不可少,其中的“*”不應(yīng)該理解為求值運(yùn)算,在此處它只是一種表示符號(hào)。(2)不能讓函數(shù)指針變量參與算術(shù)運(yùn)算,這是與數(shù)組指針變量不同的。應(yīng)該特別注意的是:函數(shù)指針變量和指針型函數(shù)這兩者在寫法和意義上是有區(qū)別的。例如,float(*p)()和float*p()是兩個(gè)完全不同的概念,3.幾點(diǎn)注意事項(xiàng) 第45頁/

35、共68頁第四十六頁,編輯于星期六:四點(diǎn) 二分。6.7 指針數(shù)組1. 指針數(shù)組的定義2. 指針數(shù)組中的字符串指針數(shù)組定義的一般形式為:類型說明符 *數(shù)組名數(shù)組長度說明 例如:int *p3;定義了一個(gè)有三個(gè)元素的指針數(shù)組,每個(gè)數(shù)組元素(指針變量)都可以指向一個(gè)整型變量。第46頁/共68頁第四十七頁,編輯于星期六:四點(diǎn) 二分。6.7 指針數(shù)組1. 指針數(shù)組的定義2. 指針數(shù)組中的字符串【例6.14】指針數(shù)組應(yīng)用舉例。int m33=1,2,3,4,5,6,7,8,9;int *pm3=m0,m1,m2; int *p=m0;main() int i; for(i=0;i3;i+) printf(%

36、d,%d,%dn,mi2-i,*mi,*(*(m+i)+i); for(i=0;i3;i+)printf(%d,%d,%dn,*pmi,pi,*(p+i);該程序的運(yùn)行結(jié)果如下:3,1,15,4,57,7,91,1,14,2,27,3,3第47頁/共68頁第四十八頁,編輯于星期六:四點(diǎn) 二分。6.7 指針數(shù)組1. 指針數(shù)組的定義2. 指針數(shù)組中的字符串指針數(shù)組也常用來表示一組字符串,這時(shí)指針數(shù)組的每個(gè)元素被賦予一個(gè)字符串的首地址。指向字符串的指針數(shù)組的初始化更為簡單。例如,采用指針數(shù)組來表示一組字符串,其初始化賦值如下:char *p=Monday,Tuesday, Wednesday,Thu

37、rsday, Friday,Saturday,Sunday;完成這個(gè)初始化賦值之后,p0即指向字符串“Monday” ,p6指向“Sunday”。第48頁/共68頁第四十九頁,編輯于星期六:四點(diǎn) 二分。6.8 二級指針一級指針是直接指向數(shù)據(jù)對象的指針,即其中存放的是數(shù)據(jù)對象,如變量或數(shù)組元素的地址。二級指針是指向指針的指針,二級指針并不直接指向數(shù)據(jù)對象,而是指向一級指針的指針,也就是說,二級指針中存放的是一級指針的地址。下圖所示是一級指針和二級指針的示意圖。地址值指針變量(a)一級指針值地址地址二級指針一級指針變量(b)二級指針一級指針和二級指針的示意圖第49頁/共68頁第五十頁,編輯于星期六

38、:四點(diǎn) 二分。6.8 二級指針二級指針的定義格式為:存儲(chǔ)類型 數(shù)據(jù)類型 *指針名;其中,指針名前面有兩個(gè)*,表示是一個(gè)二級指針。例如,有以下定義:int a,*pa,*pb;pa=&a;pb=&pa;則指針pa存放變量a的地址,即指向了變量a,指針pb存放一級指針pa的地址,即指向了pa。因此,pa是一級指針,pb是二級指針。第50頁/共68頁第五十一頁,編輯于星期六:四點(diǎn) 二分。6.8 二級指針一般情況下,二級指針必須與一級指針聯(lián)合使用才有意義,不能將二級指針直接指向數(shù)據(jù)對象?!纠?.15】用二級指針訪問二維數(shù)組。如果有如下定義:int a34;int *p3,*pp;p0=

39、a0;p1=a1;p2=a2;pp=p;第51頁/共68頁第五十二頁,編輯于星期六:四點(diǎn) 二分。6.8 二級指針可以編制用二級指針訪問二維數(shù)組的程序如下:#include main() static int a34;static int *p3,*pp;int i,j;p0=a0;p1=a1;p2=a2;p3=a3;pp=p; printf(Please enter the number of a34:n);for(i=0;i3;i+) for(j=0;j4;j+) scanf(%d,ppi+j);for(i=0;i3;i+) for(j=0;j4;j+)printf(%5d,*(*(pp+i

40、)+j); printf(n); 程序的運(yùn)行情況為:Please enter the number of a34:1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 45 6 7 89 10 11 126.8.3 二級指針的使用二級指針的使用第52頁/共68頁第五十三頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二請按水果店里的水果名字(字符的字典順序)的順序?qū)λ拿诌M(jìn)行排序,并輸出排序后的內(nèi)容。下圖所示為對應(yīng)的N-S流程圖。定義字符型數(shù)組nameN5存放水果的名稱定義指針數(shù)組*pointNfor(j=0;jN;j+)pointj=namejpoint(

41、point,N)sort(point,N)point(point,N)main函數(shù)的N-S流程圖定義整型變量ifor (i=0; in; i+)輸出數(shù)組namei中的字符串print函數(shù)的N-S流程圖第53頁/共68頁第五十四頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二請按水果店里的水果名字(字符的字典順序)的順序?qū)λ拿诌M(jìn)行排序,并輸出排序后的內(nèi)容。下圖所示為對應(yīng)的N-S流程圖。定義字符型指針變量tempfor(i=0; in-1; i+)k=ifor(j=i+1; j0 ?真假k=jk!=i ?真假temp=nameinamei=nameknamek=temp

42、sort函數(shù)的N-S流程圖第54頁/共68頁第五十五頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二#include#include#define N 6 /*定義水果種類的數(shù)目,假設(shè)為6種*/void sort(char *name,int); /*排序函數(shù)sort的說明*/void print(char *name,int); /*輸出函數(shù)print的說明*/main()static char nameN80=“ orange, banana, apple, peach, grape, tomato;/*定義二維數(shù)組存放水果的名稱*/第55頁/共68頁第五十六頁,編輯

43、于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二 char *pointN; /*定義指針數(shù)組*/ int j;for(j=0;jN;j+) pointj=namej; /*指針數(shù)組指向二維數(shù)組各行的首地址*/printf(The name of fruit before sorted:n);print(point,N); /*輸出排序前的水果名*/sort(point,N); /*調(diào)用函數(shù)sort對水果名按字典的順序進(jìn)行排序*/printf(nThe name of fruit after sorted:n);print(point,N); /*輸出排序后的水果名*/第56頁/

44、共68頁第五十七頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei;namei=namek;namek=temp; 第57頁/共68頁第五十八頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二void print(char *name,int n) /*定義輸出函數(shù)print*/ int i; for(i=0;in;i+) printf

45、(%sn,namei);程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:The name of fruit before sorted:orangebananaapplepeachgrapetomatoThe name of fruit after sorted:Applebananagrapeorangepeachtomato第58頁/共68頁第五十九頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二用指針數(shù)組求兩個(gè)矩陣a,b的和,將結(jié)果存入a,并按矩陣的形式輸出。程序代碼如下:#include#define ROW 4 /*定義矩陣的行數(shù),假設(shè)為4*/#define COL 5 /*定

46、義矩陣的列數(shù),假設(shè)為5*/main()/*定義二維數(shù)組a并賦初值*/int ROWCOL= 9,22,76,59,10, 80,90,47,35,12, 16,81,50,29,23, 45,57,89,12,15 ;第59頁/共68頁第六十頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二/*定義二維數(shù)組b并賦初值*/int bROWCOL= 23,10,17,49,0, 53,17,75,67,5, 69,87,60,21,7, 13,25,37,49,50 ;int *p2; /*定義指針數(shù)組*/int i,j;p0=a0; p1=b0; printf(matrix

47、a%d%d is :n,ROW,COL);for(i=0;iROW;i+) for(j=0;jCOL;j+) printf(“ %d,*(p0+j+COL*i); printf(n);第60頁/共68頁第六十一頁,編輯于星期六:四點(diǎn) 二分。6.9 程序舉例1. 實(shí)例一2. 實(shí)例二printf(matrix b%d%d is:n,ROW,COL);for(i=0;iROW;i+) for(j=0;jCOL;j+) printf(%d,*(p1+j+COL*i);printf(n); printf(The sum of the two matrix is:n); for(i=0;iROW;i+)

48、for(j=0;jCOL;j+) *(p0+j+COL*i )+=*(p1+j+COL*i); printf(%d,*(p0+j+COL*i); printf(n); 程序的輸出結(jié)果為:程序的輸出結(jié)果為:matrix a45 is: 9 22 76 59 1080 90 47 35 1216 81 50 29 2345 57 89 12 15matrix b45 is:23 10 17 49 053 17 75 67 569 87 60 21 713 25 37 49 50The sum of the two matrix is:32 32 93 108 10133 107 122 102 17 85 168 110 50 3058 82 126 61 65 第61頁/共68頁第六十二頁,編輯于星期六:四點(diǎn) 二分。6.10 用指針進(jìn)行內(nèi)存動(dòng)態(tài)分配Turbo C主要用兩種方法使用

溫馨提示

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

最新文檔

評論

0/150

提交評論