C語言程序設(shè)計(jì)視頻教程-徐紅波-第10章 課件.ppt
《C語言程序設(shè)計(jì)視頻教程-徐紅波-第10章 課件.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計(jì)視頻教程-徐紅波-第10章 課件.ppt(39頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、C程序設(shè)計(jì)講師:徐紅波Email: x_h_ 第10章 指針 指針是C語言中的一個(gè)重要概念,也是C語言的一個(gè)重要特色。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能獲得1個(gè)以上的結(jié)果;能直接處理內(nèi)存單元地址等,這對(duì)設(shè)計(jì)系統(tǒng)軟件是非常必要的。掌握指針的應(yīng)用,可以使程序簡潔、緊湊、高效。每一個(gè)學(xué)習(xí)和使用C語言的人,都應(yīng)當(dāng)深入地學(xué)習(xí)和掌握指針??梢哉f,不掌握指針就是沒有掌握C的精華。 10.1 地址和指針的概念l變量的屬性:名、值和地址l變量的訪問方式:直接訪問、間接訪問l變量的地址稱為該變量的“指針”l指針變量是存放地址的變
2、量 10.2 變量的指針和指向變量的指針變量變量的指針就是變量的地址。存放變量地址的變量是指針變量,它用來指向另一個(gè)變量。為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中用“*”符號(hào)表示“指向”。如果已定義i_pointer為指針變量,則(*i_pointer)是i_pointer所指向的變量。 10.2.1 定義一個(gè)指針變量C語言規(guī)定所有變量在使用前必須定義,指定其類型,并按此分配內(nèi)存單元。指針變量不同于整型變量和其他類型的變量,它是用來專門存放地址的,必須將它定義為“指針類型”。定義指針變量的一般形式為基類型 * 指針變量名;可以用賦值語句使一個(gè)指針變量得到另一個(gè)變量的地址,從而使它指
3、向一個(gè)該變量。 在定義指針變量時(shí)要注意兩點(diǎn):(1)指針變量前面的“*”表示該變量的類型為指針型變量(2)在定義指針變量時(shí)必須指定基類型 10.2.2 指針變量的引用指針變量中只能存放地址(指針),不要將一個(gè)整數(shù)(或其他非地址類型的數(shù)據(jù))賦給一個(gè)指針變量。有兩個(gè)有關(guān)的運(yùn)算符:(1)int * pointer_1, * pointer_2;a=100; b=10;pointer_1=pointer_2=printf(“%d, %dn”, a, b);printf(“%d, %dn”, *pointer_1, *pointer_2); 對(duì)“(1)scanf(“%d, %d”, p1= p2=if(a
4、b) p1= p2=printf(“a=%d, b=%dnn”, a, b); printf(“max=%d, min=%dn”, *p1, *p2); 10.2.3 指針變量作為函數(shù)參數(shù)函數(shù)的參數(shù)不僅可以是整型、浮點(diǎn)型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。 例10.3題目要求同例10.2,即對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出#include void main() void swap(int * p1, int * p2);int a, b;int * pointer_1, *pointer_2;scanf(“%d, %d”, pointer_1=poi
5、nter_2=if(ab)swap(pointer_1, pointer_2); printf(“n%d, %dn”,a, b); void swap(int * p1, int * p2) int temp;temp=*p1;*p1=*p2;*p2=temp; 例10.4輸入a、b、c這3個(gè)整數(shù),按大小順序輸出void main() int a,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,p1=p2=pe=exchange(p1,p2,p3);printf(“n%d,%d,%dn”,a,b,c); void exchange(int *q1,int *q2,int *
6、q3) if(*q1*q2) swap(q1,q2);if(*q1*q3) swap(q1,q3);if(*q2*q3) swap(q2,q3);void swap(int *pt1,int * pt2) int temp;temp=*pt1;*pt1=*pt2;*pt2=temp; 10.3 數(shù)組與指針一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個(gè)指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址。引用數(shù)組元素可以用下標(biāo)法(如a3),也可以用指針法,即通過指向數(shù)組元素的指
7、針找到所需的元素。使用指針法能使目標(biāo)程序質(zhì)量高(占內(nèi)存少,運(yùn)行速度快)。 10.3.1 指向數(shù)組元素的指針定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。例如:int a10;int * p;p=p=a; 10.3.2 通過指針引用數(shù)組元素假設(shè)p已定義為一個(gè)指向整型數(shù)據(jù)的指針變量,并已給它賦了一個(gè)整型數(shù)組元素的地址,使它指向某一個(gè)數(shù)組元素。如果有以下賦值語句:*p=1;表示將1賦給p當(dāng)前所指向的數(shù)組元素。 如果p的初值為p=a;for(i=0; i10; i+)scanf(“%d”, p+);printf(“n”);for(i=0; i10; i+, p+)print
8、f(“%d “, *p);printf(“n”); 10.3.3 用數(shù)組名作函數(shù)參數(shù)如果一個(gè)實(shí)參數(shù)組,要想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種情況(1)形參和實(shí)參都用數(shù)組名(2)實(shí)參用數(shù)組名,形參用指針變量(3)實(shí)參形參都用指針變量(4)實(shí)參為指針變量,形參為數(shù)組名例10.7將數(shù)組a中n個(gè)整數(shù)按相反順序存放例10.8用實(shí)參指針改寫例10.7 例10.9用選擇法對(duì)10個(gè)整數(shù)按由大到小順序排序 10.3.4 多維數(shù)組與指針用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。 1、多維數(shù)組元素的地址i
9、nt a34=1,3,5,7,9,11,13,15,17,19,21,23;a是一個(gè)數(shù)組名。A數(shù)組包含三行,即3個(gè)元素:a0、a1、a2。而每一個(gè)元素又是一個(gè)一維數(shù)組,它包含4個(gè)元素(即4個(gè)列元素)。例如,a0所代表的一維數(shù)組又包含4個(gè)元素:a00、a01、a02、a03。可以認(rèn)為二維數(shù)組是“數(shù)組的數(shù)組”,即二維數(shù)組a是由3個(gè)一維數(shù)組所組成的。例10.10輸出二維數(shù)組有關(guān)的值 2、指向多維數(shù)組元素的指針變量(1)指向數(shù)組元素的指針變量例10.11用指針變量輸出二維數(shù)組元素的值(2)指向由m個(gè)元素組成的一維數(shù)組的指針變量例10.12輸出二維數(shù)組任一行任一列的值 3、用指向數(shù)組的指針作函數(shù)參數(shù)一維
10、數(shù)組名可以作為函數(shù)參數(shù)傳遞,多維數(shù)組名也可作函數(shù)參數(shù)傳遞。在用指針變量作形參以接受實(shí)參數(shù)組名傳遞來的地址時(shí),有兩種方法:1、用指向變量的指針變量2、用指向一維數(shù)組的指針變量例10.13有一個(gè)班,3個(gè)學(xué)生,各學(xué)4門課,計(jì)算總平均分?jǐn)?shù)以及第n個(gè)學(xué)生的成績例10.14在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,輸出他們的全部課程的成績 10.4 字符串與指針10.4.1 字符串的表示形式在C程序中,可以用兩種方法訪問一個(gè)字符串(1)用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。例10.15定義一個(gè)字符數(shù)組,對(duì)它初始化,然后輸出該字符串(2)用字符指針指向一個(gè)字符串例10.16定義字符指針例10.17
11、將字符串a(chǎn)賦值為字符串b例10.18用指針變量來處理例10.17問題 10.4.2 字符指針作函數(shù)參數(shù)將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以用地址傳遞的方法,即用字符數(shù)組名作參數(shù),也可以用指向字符的指針變量作參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容,在主調(diào)函數(shù)中可以得到改變了的字符串。例10.19用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制(1)用字符數(shù)組作參數(shù)(2)形參用字符指針變量 10.4.3 對(duì)使用字符指針變量和字符數(shù)組的討論雖然用字符數(shù)組和字符指針變量都能實(shí)現(xiàn)字符串的存儲(chǔ)和運(yùn)算,但它們兩者之間是有區(qū)別的,不應(yīng)混為一談,主要有以下幾點(diǎn)。(1)字符數(shù)組由若干個(gè)元素組成,每個(gè)元素中放一個(gè)字符,而字符
12、指針變量中存放的是地址,決不是將字符串放到字符指針變量中。(2)賦值方式。(3)對(duì)字符指針變量賦初值。(4)如果定義了一個(gè)字符數(shù)組,在編譯時(shí)為它分配內(nèi)存單元,它有確定的地址。而定義一個(gè)字符指針變量時(shí),給指針變量分配內(nèi)存單元,在其中可以放一個(gè)字符變量的地址,也就是說,該指針變量可以指向一個(gè)字符型數(shù)據(jù),但如果未對(duì)它賦予一個(gè)地址值,則它并未具體指向一個(gè)確定的字符數(shù)據(jù)。(5)指針變量的值是可以改變的。例10.20改變指針變量的值例10.21用帶下標(biāo)的字符指針變量引用字符串中的字符(6)用指針變量指向一個(gè)格式字符串,可以用它代替printf函數(shù)中的格式字符串。 10.5 指向函數(shù)的指針10.5.1 用函
13、數(shù)指針變量調(diào)用函數(shù)可以用指針變量指向整型變量、字符串、數(shù)組,也可以指向一個(gè)函數(shù)。一個(gè)函數(shù)在編譯時(shí)被分配給一個(gè)入口地址。這個(gè)函數(shù)的入口地址就稱為函數(shù)的指針??梢杂靡粋€(gè)指針變量指向函數(shù),然后通過該指針變量調(diào)用此函數(shù)。例10.22求a和b中的大者 說明:(1)指向函數(shù)的指針變量的一般定義形式為數(shù)據(jù)類型 (*指針變量名) (函數(shù)參數(shù)表列);(2)函數(shù)的調(diào)用可以通過函數(shù)名調(diào)用,也可以通過函數(shù)指針調(diào)用(即用指向函數(shù)的指針表量調(diào)用)。(3)“int (*p)(int,int);”表示定義一個(gè)指向函數(shù)的指針變量p,它不是固定指向哪一個(gè)函數(shù)的,而是表示定義了這樣一個(gè)類型的變量,它是專門用來存放函數(shù)的入口地址的。
14、(4)在給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名而不必給出參數(shù)。(5)用函數(shù)指針變量調(diào)用函數(shù)時(shí),只需將(*p)代替函數(shù)名即可,在(*p)之后的括號(hào)中根據(jù)需要寫上實(shí)參。(6)對(duì)指向函數(shù)的指針變量,像p+n、p+等運(yùn)算是無意義的。 10.5.2 用指向函數(shù)的指針作函數(shù)參數(shù)函數(shù)指針變量通常的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。函數(shù)的參數(shù)可以是變量、指向變量的指針變量、數(shù)組名、指向數(shù)組的指針變量等。函數(shù)的指針也可以作為參數(shù),以實(shí)現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實(shí)參函數(shù)。例10.23設(shè)一個(gè)函數(shù)process,在調(diào)用它的時(shí)候,每次實(shí)現(xiàn)不同的功能。輸入a和b兩個(gè)數(shù),第一調(diào)用process時(shí)找
15、出a和b中大者,第二次找出其中小者,第三次求a與b之和 10.6 返回指針值的函數(shù)一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是返回的值的類型是指針類型而已。這種返回指針值的函數(shù),一般定義形式為類型名 * 函數(shù)名(參數(shù)表列);例10.24有若干個(gè)學(xué)生的成績(每個(gè)學(xué)生有4門課程),要求在用戶輸入學(xué)生序號(hào)后,能輸出該學(xué)生的全部成績。用指針函數(shù)來實(shí)現(xiàn)例10.25對(duì)上例中的學(xué)生,找出其中不及格課程的學(xué)生及其學(xué)生號(hào) 10.7 指針數(shù)組和指向指針的指針10.7.1 指針數(shù)組的概念一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每
16、一個(gè)元素都相當(dāng)于一個(gè)指針變量。一維指針數(shù)組的定義形式為類型名 * 數(shù)組名數(shù)組長度;例如:int * p4;例10.26將若干字符串按字母順序輸出 10.7.2 指向指針的指針在掌握了指針數(shù)組的概念的基礎(chǔ)上,下面介紹指向指針數(shù)據(jù)的指針變量,簡稱為指向指針的指針。例10.27使用指向指針的指針例10.28指針數(shù)組的元素指向整型數(shù)據(jù) 10.7.3 指針數(shù)組作main函數(shù)的形參指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。在以往的程序中,main函數(shù)的第一行一般寫成以下形式:void main()括號(hào)中是空的。實(shí)際上,main函數(shù)可以有參數(shù),例如:void main(int argc, char *
17、 argv) 10.8 有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算的小結(jié)10.8.1 有關(guān)指針的數(shù)據(jù)類型的小結(jié)定義含義int i;定義整型變量iint * p; p為指向整型數(shù)據(jù)的指針變量int an;定義整型數(shù)組a,它有n個(gè)元素int * pn;定義指針數(shù)組p,它由n個(gè)指向整型數(shù)據(jù)的指針元素組成int (*p)n; p為指向含n個(gè)元素的一維數(shù)組的指針變量int f(); f為返回整型函數(shù)值的函數(shù)int * p(); p為返回一個(gè)指針的函數(shù),該指針指向整型數(shù)據(jù)int (*p)(); p為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型值 int * p; p是一個(gè)指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量 10.8.2
18、指針運(yùn)算小結(jié) (1)指針變量加(減)一個(gè)整數(shù)(2)指針變量賦值(3)指針變量可以有空值,即該指針變量不指向任何變量(4)兩個(gè)指針變量可以相減(5)兩個(gè)指針變量比較 10.8.3 void指針類型ANSI新標(biāo)準(zhǔn)增加了一個(gè)“void”指針變量,即可定義一個(gè)指針變量,但不指定它是指向哪一種類型數(shù)據(jù)的。ANSI C標(biāo)準(zhǔn)規(guī)定用動(dòng)態(tài)存儲(chǔ)分配函數(shù)時(shí)返回void指針,它可以用來指向一個(gè)抽象的類型的數(shù)據(jù),在將它的值賦給另一指針變量時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換使之適合于被賦值的變量的類型。 小結(jié)在本章中介紹了指針的基本概念和初步應(yīng)用。應(yīng)該說明,指針是C語言中重要的概念,是C的一個(gè)特色。使用指針的優(yōu)點(diǎn):(1)提高程序效率;(2)在調(diào)用函數(shù)時(shí)變量改變了的值能夠?yàn)橹髡{(diào)函數(shù)使用,即可以從函數(shù)調(diào)用得到多個(gè)可改變的值;(3)可以動(dòng)態(tài)存儲(chǔ)分配。但是同時(shí)應(yīng)該看到,指針使用實(shí)在太靈活,對(duì)熟練的程序員來說,可以利用它編寫出頗有特色的、質(zhì)量優(yōu)良的程序,實(shí)現(xiàn)許多用其他高級(jí)語言難以實(shí)現(xiàn)的功能,但也十分容易出錯(cuò),而且這種錯(cuò)誤往往比較隱蔽。由于指針運(yùn)用的錯(cuò)誤可能會(huì)使整個(gè)程序遭受破壞,比如由于未對(duì)指針變量p賦值就向*p賦值,就可能破壞了有用的單元的內(nèi)容。有人說指針是有利有弊的工具,如果使用指針不當(dāng),會(huì)出現(xiàn)隱蔽的、難以發(fā)現(xiàn)和排除的故障。因此,使用指針要十分小心謹(jǐn)慎,要多上機(jī)調(diào)試程序,以弄清一些細(xì)節(jié),并積累經(jīng)驗(yàn)。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案