九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁(yè) 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt

  • 資源ID:11494836       資源大?。?span id="24d9guoke414" class="font-tahoma">598KB        全文頁(yè)數(shù):120頁(yè)
  • 資源格式: PPT        下載積分:14.9積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要14.9積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開,此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無(wú)水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請(qǐng)知曉。

C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt

2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,1,8.1指針與指針變量8.2指向數(shù)組的指針變量8.3指向字符串的指針變量8.4指針數(shù)組與命令行參數(shù)8.5指針與函數(shù)8.6指針小結(jié),第8章指針,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,2,教學(xué)提示“指針”是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型,運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配,不但能很方便地使用數(shù)組和字符串,還能像匯編語(yǔ)言一樣處理內(nèi)存地址,從而編出精練而高效的程序。但是,由于指針概念較復(fù)雜,使用較靈活,初學(xué)者常常感到較難理解,因此,學(xué)習(xí)時(shí)必須從指針的概念入手,正確理解指針及指針在數(shù)組和函數(shù)方面的應(yīng)用。教學(xué)目標(biāo)要求學(xué)生掌握指針的概念和運(yùn)算規(guī)則,掌握用指針訪問變量、一維數(shù)組和二維數(shù)組的方法,以及用指針處理字符串的方法。通過多編程、多上機(jī)調(diào)試程序來體會(huì)指針的概念及其使用的規(guī)律,并應(yīng)用于實(shí)際的編程中。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,3,8.1指針與指針變量,8.1.1指針的概念1.內(nèi)存與內(nèi)存地址內(nèi)存地址:內(nèi)存是計(jì)算機(jī)用于存儲(chǔ)數(shù)據(jù)的存儲(chǔ)器,以一個(gè)字節(jié)作為存儲(chǔ)單元,為了便于訪問,給每個(gè)字節(jié)單元一個(gè)唯一的編號(hào),第一字節(jié)單元編號(hào)為0,以后各單元按順序連續(xù)編號(hào),這些單元編號(hào)稱為內(nèi)存單元的地址。變量地址:變量所分配存儲(chǔ)空間的首字節(jié)單元地址(字節(jié)單元編號(hào))。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,4,2、變量、變量名、變量的地址、變量值每個(gè)變量都通過變量名與相應(yīng)的存儲(chǔ)單元相連系,具體分配哪些單元給變量,由編譯系統(tǒng)完成變量名到對(duì)應(yīng)內(nèi)存單元地址的變換。變量分配存儲(chǔ)空間的大小由類型決定。變量的值則是指相應(yīng)存儲(chǔ)單元的內(nèi)容。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,5,3、指針、變量的指針和指針變量指針:就是“內(nèi)存單元的地址”。指針指向一個(gè)內(nèi)存單元。變量的指針:就是“變量的地址”。變量的指針指向一個(gè)變量對(duì)應(yīng)的內(nèi)存單元。指針變量:就是地址變量。地址(指針)也是數(shù)據(jù),可以保存在一個(gè)變量中。保存地址(指針)數(shù)據(jù)的變量稱為指針變量。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,6,系統(tǒng)為特殊變量p(用來存放地址的)分配的存儲(chǔ)空間地址是4800,p中保存的是變量a的地址,即4000,當(dāng)要讀取a變量的值12345時(shí),不是直接通過a變量,也不是直接通過保存12345的內(nèi)存單元的地址4000去取值,而是先通過變量p得到p的值4000,即a的地址,再根據(jù)地址4000讀取它所指向單元的值12345。,這種間接的通過變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取”。通常稱變量p指向變量a,變量a是變量p所指向的對(duì)象,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,7,4、變量值的存取通過變量在內(nèi)存中的地址進(jìn)行存取,系統(tǒng)執(zhí)行“scanf(”%d“,”時(shí),存取變量a值的方式可以有兩種:直接訪問直接利用變量的地址進(jìn)行存取。1)上例中scanf(“%d”,(定義p1為指向?qū)嵭妥兞康闹羔樧兞?char*p2;(定義p2為指向字符型變量的指針變量)在指針變量定義中,*是一個(gè)說明符,它表明其后的變量是指針變量,如p是指針變量,而不要認(rèn)為“*p”是指針變量。指針變量定義時(shí)指定的數(shù)據(jù)類型不是指針變量本身的數(shù)據(jù)類型,而是指針變量所指向的對(duì)象(或稱目標(biāo))的數(shù)據(jù)類型指針變量存放的是所指向的某個(gè)變量的地址值,而普通變量保存的是該變量本身的值指針變量并不固定指向一個(gè)變量,可指向同類型的不同變量,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,12,(1)指針運(yùn)算符與地址運(yùn)算符與指針引用有關(guān)的兩個(gè)運(yùn)算符:語(yǔ)句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。因?yàn)檫@些指針變量還沒有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(nèi)存單元)。指針變量初始化:在定義指針時(shí)同時(shí)給指針一個(gè)初始值如:inta,*p=,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,14,8.1.3指針變量的引用,與指針引用有關(guān)的兩個(gè)運(yùn)算符:(1)float*pf;第一行定義了整型變量a,b及指針變量pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變量,下面語(yǔ)句完成對(duì)pa,pb的賦值:pa=,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,17,例如:intj,k;int*pointer1,*pointer2;pointer1=,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,18,(2)相同類型的指針變量間的賦值,pa與pb都是整型指針變量,它們間可以相互賦值,如:pb=pa;即pa,pb都指向變量a,此時(shí)a、*pa、*pb是等價(jià)的。指針指向變化如下圖:,注意:只有相同類型的指針變量才能相互賦值,如pf=pa;是不允許的。因?yàn)閜a是整型指針,pf是浮點(diǎn)型指針。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,19,()給指針變量賦空值,給指針變量賦空值,說明該指針不指向任何變量?!翱铡敝羔樦涤肗ULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為,在使用時(shí)應(yīng)加上預(yù)定義行,如:#include"stdio.h"int*pa=NULL;亦可以用下面的語(yǔ)句給指針賦“空值”:pa=0;或:pa=0;這里指針pa并非指向0地址單元,而是具有一個(gè)確定的“空值”,表示pa不指向任何變量。注意:指針雖然可以賦值0,但卻不能把其它的常量地址賦給指針。例如:pa=4000;是非法的。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,20,例8.1指針定義與初始化,main()inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,21,程序運(yùn)行結(jié)果:100,10100,10,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,22,例8.2從鍵盤上輸入兩個(gè)整數(shù)到a、b,按由大到小輸出。,#includemain()inta,b,*pa=/*pa指向大數(shù),pb指向小數(shù)*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,23,若輸入:1222輸出結(jié)果:a=12,b=22max=22,min=12,(b)(c)指針變化示意圖,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,24,2.指針的算術(shù)運(yùn)算,(1)加減運(yùn)算:一個(gè)指針可以加、減一個(gè)整數(shù)n,其結(jié)果與指針?biāo)笇?duì)象的數(shù)據(jù)類型有關(guān)。指針變量的值應(yīng)增加或減少“nsizeof(指針類型)”。加減運(yùn)算常用于數(shù)組的處理。對(duì)指向一般數(shù)據(jù)的指針,加減運(yùn)算無(wú)實(shí)際意義。例如:inta10,*p=a,*x;x=p+3;/*實(shí)際上是p加上3*2個(gè)字節(jié)賦給x,x指向數(shù)組的第三個(gè)分量*/對(duì)于不同基類型的指針,指針變量“加上”或“減去”一個(gè)整數(shù)n所移動(dòng)的字節(jié)數(shù)是不同的。例如:floata10,*p=a,*x;p=p+3;/*實(shí)際上是p加上3*4個(gè)字節(jié)賦給x,x依然指向數(shù)組的第三個(gè)分量*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,25,(2)自增自減運(yùn)算,指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),但有前置后置、先用后用的考慮,務(wù)請(qǐng)小心。例如:inta10,*p=a,*x;x=p+;/*x第一個(gè)元素分量,p指向第二個(gè)元素*/x=+p;/*x、p均指向數(shù)組的第二個(gè)分量*/*p+相當(dāng)于*(p+)。*(p+)與(*p)+含義不同,前者表示地址自增,后者表示當(dāng)前所指向的數(shù)據(jù)自增。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,26,2.*執(zhí)行了“p=int*p;p=(把數(shù)組的首地址賦給指針變量p),p=把a(bǔ)0元素的地址賦給指針變量p。也就是說,p指向a數(shù)組的第一個(gè)元素。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,30,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,31,C語(yǔ)言規(guī)定:數(shù)組名代表數(shù)組首地址,是一個(gè)地址常量。因此,下面兩個(gè)語(yǔ)句等價(jià):p=兩句。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,32,指向數(shù)組的指針變量p,a+0,p+1或a+1,p+9或a+9,*(a+9)或*(p+9),2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,33,8.2.2.通過指針引用數(shù)組元素*p=5;表示對(duì)p當(dāng)前所指的數(shù)組元素賦以一個(gè)值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡(jiǎn)單地加1)。p+1意味著使p的原值(地址)加d個(gè)字節(jié)(d為一個(gè)數(shù)組元素所占的字節(jié)數(shù))。,如果p的初值為inti;for(i=0;i<10;i+)scanf("%d",例8.5用三種方法輸出數(shù)組全部元素。(1)下標(biāo)法,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,36,main()inta10;inti;for(i=0;i<10;i+)scanf("%d",(2)通過數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,37,(3)用指針變量指向數(shù)組元素main()inta10;int*p,i;for(i=0;i<10;i+)scanf("%d",三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而用指針法則執(zhí)行效率更高。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,38,使用指針變量時(shí),應(yīng)注意:(1)指針變量可實(shí)現(xiàn)使本身的值改變。P+合法;但a+不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運(yùn)行中是固定不變的。)(2)要注意指針變量的當(dāng)前值。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,39,(3)*p+相當(dāng)于*(p+),因?yàn)?與+優(yōu)先級(jí)相同,且結(jié)合方向從右向左,其作用是先獲得p指向變量的值,然后執(zhí)行p=p+1;(4)*(p+)與*(+p)意義不同,后者是先p=p+1,再獲得p指向的變量值。若p=a,則輸出*(p+)是先輸出a0,再讓p指向a;輸出*(+p)是先使p指向a,再輸出p所指的a。(5)(*p)+表示的是將p指向的變量值+,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,40,8.2.3用數(shù)組名作函數(shù)參數(shù),用數(shù)組名作函數(shù)參數(shù)時(shí),由于數(shù)組名代表的是數(shù)組起始地址,因此傳遞的值是數(shù)組首地址,所以要求形參為指針變量。引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時(shí),可有種等價(jià)形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)):(1)形參、實(shí)參都用數(shù)組名(2)形參、實(shí)參都用指針變量(3)形參用指針變量、實(shí)參用數(shù)組名(4)形參用數(shù)組名、實(shí)參用指針變量,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,41,例8.4將數(shù)組a中n個(gè)整數(shù)按相反順序存放。,算法為:將a0與an-1對(duì)換,再a1與an-2對(duì)換,直到將a(n-1/2)與an-int(n-1)/2)對(duì)換。今用循環(huán)處理此問題,設(shè)兩個(gè)“位置指示變量”i和j,i的初值為0,j的初值為n-1。將ai與aj交換,然后使i的值加1,j的值減1,再將ai與aj交換,直到i=(n-1)/2為止,如圖所示。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,42,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,43,程序如下:voidinv(intx,intn)/*形參x是數(shù)組名*/inttemp,i,j,m=(n-1)/2;for(i=0;i<=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;return;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,44,main()inti,a10=3,7,9,11,0,6,7,5,4,2;printf("Theoriginalarray:n");for(i=0;i<10;i+)printf("%d,",ai);printf("n");inv(a,10);/*實(shí)參是數(shù)組名*/printf("Thearrayhasbeeninverted:n");for(i=0;i<10;i+)printf("%d,",ai);printf("n");,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,45,對(duì)例8.4作一些改動(dòng),將函數(shù)inv中的形參x改成指針變量。實(shí)參為數(shù)組名a,即數(shù)組a的首地址,將它傳給形參指針變量x,這時(shí)x就指向a0。x+m是am元素的地址。設(shè)i和j以及p都是指針變量,i指向x,j指向x+n-1,使*i與*j交換就是使ai與aj交換。見下例。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,46,程序如下:voidinv(int*x,intn)/*形參x為指針變量*/int*p,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i<=p;i+,j-)temp=*i;*i=*j;*j=temp;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,47,main()inti,a10=3,7,9,11,0,6,7,5,4,2;printf("Theoriginalarray:n");for(i=0;i<10;i+)printf("%d,",ai);printf("n");inv(a,10);/*實(shí)參是數(shù)組名*/printf("Thearrayhasbenninverted:n");for(i=0;i<10;i+)printf("%d,",ai);printf("n");,運(yùn)行情況與前一程序相同。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,48,歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下種:形參和實(shí)參都是數(shù)組名。如:main()inta10;f(a,10),f(intx,intn)這時(shí)形參x和實(shí)參a共用一段內(nèi)存單元。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,49,實(shí)參用數(shù)組,形參用指針變量。如:main()inta10;f(a,10),f(int*x,intn),2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,50,實(shí)參、形參都用指針變量。如:main()inta10,*p=a;f(p,10),f(int*x,intn),2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,51,實(shí)參為指針變量,形參為數(shù)組名。如:main()inta10,*p=a;f(p,10),以上四種方法,本質(zhì)上都是地址的傳遞。其中(1)(4)兩種只是形式上的不同,實(shí)際上都是使用指針變量。,f(intx,intn),2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,52,例8.6用選擇法對(duì)10個(gè)整數(shù)排序。,main()int*p,i,a10=3,7,9,11,0,6,7,5,4,2;printf("Theoriginalarray:n");for(i=0;i<10;i+)printf("%d,",ai);printf("n");p=a;sort(p,10);for(p=a;p<a+10;p+)printf("%d",*p);printf("n");,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,53,sort(intx,intn)inti,j,k,t;for(i=0;ixk)k=j;if(k!=i)t=xi;xi=xk;xk=t;,說明:函數(shù)sort用數(shù)組名作為形參,也可改為用指針變量,這時(shí)函數(shù)的首部可以改為:sort(int*x,intn)其他可一律不改。這時(shí)將x定義為指針變量,在函數(shù)中仍可用xi、xk這樣的形式表示數(shù)組元素,它就是x+i和x+k所指的數(shù)組元素。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,54,8.2.4指向多維數(shù)組的指針變量,1.二維數(shù)組的地址設(shè)有一個(gè)二維數(shù)組a,它有三行四列:inta34=0,1,2,3,4,5,6,7,8,9,10,11數(shù)組名a:代表整個(gè)二維數(shù)組的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(見下頁(yè)圖),2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,55,數(shù)組名a代表整個(gè)二維數(shù)組的首地址:,上圖a數(shù)組包含三個(gè)元素:a0,a1,a2.而每個(gè)元素又是一個(gè)一維數(shù)組,它包含4個(gè)元素(即4個(gè)列元素),如:a0又包含:a00,a01,a02,a03.,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,56,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,57,數(shù)組及數(shù)組元素的地址表示如下:從二維數(shù)組的角度來看,a是二維數(shù)組名,a代表整個(gè)二維數(shù)組的首地址,也是二維數(shù)組第0行的首地址,等于1000。a+1代表第一行的首地址,等于1008。如圖8.11所示:,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,58,一維數(shù)組名ai:代表第i行的首地址,即第i行中第0列元素的地址(既intk,j,*p;for(j=0;j<2;j+)/*方式1*/for(k=0;k<3;k+)printf("%5d",*(aj+k);/*aj是j行首地址,aj+k是j行k列元素的地址*/putchar(n);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,63,接上頁(yè):,for(j=0;j<2;j+)/*方式2*/for(k=0;k<3;k+)printf("%5d",*(*(a+j)+k);/*(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/putchar(n);p=a;/*p指向數(shù)組的第一個(gè)元素*/for(j=0;j<2;j+)/*方式3*/for(k=0;k<3;k+)printf("%5d",*(p+);/*輸出p所指示的元素*/putchar(n);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,64,輸出的結(jié)果是:034503450345,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,65,對(duì)二維數(shù)組,注意區(qū)分以下表示的不同含義:a、二維數(shù)組名、數(shù)組首址是常量指針。a+i、如:inta34;int(*p)4;p=a;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,67,注意:(1)int(*p)4;定義一個(gè)指針變量p,p指向包含4個(gè)元素的一維數(shù)組。(2)p+i與*(p+i)的區(qū)別:p+i是指向第i行的指針(第i行的首地址);*(p+i)是指向第i行第1個(gè)元素的地址;兩者數(shù)值相等,但含義不同:p+i的增值將以行長(zhǎng)為單位,而*(p+i)增值將以元素長(zhǎng)度為單位。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,68,即:p+i+1將指向第i行再下一行的首地址,而*(p+i)+1將指向第i行首元素的下一個(gè)元素地址。(見下圖)設(shè)inta34,(*p)4;p=a;,如果p先指向a0,則p+1不是指向a01,而是指向a1,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,69,例8.7main()staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4,i,j;p=a;scanf("i=%d,j=%d",2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,70,例8.8用指向二維數(shù)組的指針變量輸出二維數(shù)組,并將數(shù)組中的最大元素及所在行列號(hào)輸出。,main()inta34=1,3,5,7,9,11,13,15,17,19,21,23;inti,j,max,*p;introw=0,col=0;p=a0;/*指針p指向數(shù)組a的第0行第0列*/max=*p;/*先把第一個(gè)元素作為最大值*/for(i=0;i<3;i+)printf(“n”);for(j=0;j<4;j+)printf(“%5d”,*p);if(max<*p)max=*p;row=i;col=j;p+;printf(“nmaxis:a%2d%2d=%-4d”,row,col,max);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,71,運(yùn)行結(jié)果:1357911131517192123maxis:a23=23,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,72,例8.9用行指針變量輸出二維數(shù)組,并將數(shù)組中的最大元素及所在行列號(hào)輸出。,main()inta34=1,3,5,7,9,11,13,15,17,19,21,23;inti,j,max,row=0,col=0;int(*p)4;/*定義p為指向一個(gè)有4個(gè)元素的行指針變量*/p=a;/*指針p指向數(shù)組a的第0行*/max=*p;/*先把第一個(gè)元素作為最大值*/for(i=0;i<3;i+)printf(“n”);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,73,for(j=0;j<4;j+)printf(“%5d”,*(*p+j);/*(*p+j)相當(dāng)于*(*(p+0)+j)是第0行第j列的元素*/if(max<*(*p+j)max=*(*p+j);row=i;col=j;p+;/*p指向下一行*/printf(“nmaxis:a%2d%2d=%-4d”,row,col,max);,運(yùn)行結(jié)果與上例相同。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,74,注意:例8.8與例8.9中p+所在的位置,例8.9中是在外循環(huán)內(nèi),處理完一行后再下移指針,而例8.8中是在內(nèi)循環(huán)中,每處理完一個(gè)元素就下移指針。例8.9中使用的語(yǔ)句p=a,由于p是指向一維數(shù)組的行指針變量,與a一樣都是二級(jí)指針,故可以直接賦值。而此處若改為p=a0或p=printf("%sn",string);運(yùn)行時(shí)輸出:ILoveChina!,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,76,用字符指針指向字符串:字符指針變量的定義:char*指針變量;如:char*p;(1)在定義時(shí)初始化指針變量使指針指向一個(gè)字符串。main()char*string=“ILoveChina!”;(初始化string)printf("%sn",string);運(yùn)行時(shí)也輸出:ILoveChina!,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,77,char*str=“Ilovechina”,str140;等價(jià)于下列兩句:char*str;str=“Ilovechina”;以上語(yǔ)句的含義:定義str為指針變量,它指向字符型數(shù)據(jù),且賦值語(yǔ)句把字符串“Ilovechina”的首地址賦給了指針變量str。對(duì)字符串的整體輸出實(shí)際上還是從指針?biāo)甘镜淖址_始逐個(gè)顯示(系統(tǒng)在輸出一個(gè)字符后自動(dòng)執(zhí)行p+),直到遇到字符串結(jié)束標(biāo)志符0為止。而在輸入時(shí),亦是將字符串的各字符自動(dòng)順序存儲(chǔ)在p指示的存儲(chǔ)區(qū)中,并在最后自動(dòng)加上0。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,78,(2)用指針變量來實(shí)現(xiàn)對(duì)字符串的訪問例8.8將一已知字符串第n個(gè)字符開始的剩余字符復(fù)制到另一字符串中。,main()inti,n;chara="computer"charb10,*p,*q;p=a;q=b;scanf("%d",/*指針指到要復(fù)制的第一個(gè)字符*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,79,for(;*p!=0;p+,q+)*q=*p;*q=0;/*字符串以0結(jié)尾*/printf("Stringa:%sn",a);printf("Stringb:%sn",b);,輸入:3輸出:computermputer考慮一下,若輸出語(yǔ)句改為如下語(yǔ)句會(huì)如何?printf(“stringais:%sn”,p);printf(“stringbis%sn”,q);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,80,8.3.2字符串指針作函數(shù)參數(shù),將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以用地址傳遞的方法,即用字符數(shù)組名作參數(shù)或用指向字符串的指針變量作參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容,在主調(diào)函數(shù)中可以得到改變了的字符串。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,81,例8.15用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制。,voidcopy_string(charfrom,charto)inti=0;while(fromi!=0)toi=fromi;i+;toi=0;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,82,main()chara=”Iamateacher.”;charb=”youareastudent.”;printf(“stringa=%snstringb=%sn”,a,b);copy_string(a,b);printf(“nstringa=%snstringb=%sn”,a,b);,運(yùn)行結(jié)果如下:stringa=Iamateacher.stringb=youareastudent.stringa=Iamateacher.stringb=Iamateacher.,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,83,8.3.3字符串?dāng)?shù)組字符串?dāng)?shù)組:是指數(shù)組中的每個(gè)元素都是一個(gè)存放字符串的數(shù)組。字符串?dāng)?shù)組可以用一個(gè)二維字符數(shù)組來存儲(chǔ)。例如:charlanguge310;數(shù)組的第一個(gè)下標(biāo)決定字符串的個(gè)數(shù),第二個(gè)下標(biāo)是字符串的最大長(zhǎng)度(實(shí)際最多9個(gè)字符,0占一位置)??梢詫?duì)字符串?dāng)?shù)組賦初值。例如:charlanguge310;=“Basic”,“c+”,“pascal”,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,84,其內(nèi)存存儲(chǔ)情況如圖8.14所示:,由于字符數(shù)組變量在定義時(shí)就確定了大小,每行元素都是固定的,而字符串長(zhǎng)度不等,這樣會(huì)浪費(fèi)存儲(chǔ)空間。使用字符型指針數(shù)組可以更方便地處理字符串?dāng)?shù)組。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,85,8.4指針數(shù)組與命令行參數(shù)8.4.1指針數(shù)組指針數(shù)組:是指針變量的集合。即它的每一個(gè)元素都是指針變量,且都具有相同的存儲(chǔ)類別和指向相同的數(shù)據(jù)類型。指針數(shù)組的定義形式為:類型標(biāo)識(shí)符*數(shù)組名數(shù)組長(zhǎng)度說明;例如:int*p10;由于比*的優(yōu)先級(jí)高,因此p先與10結(jié)合成p10,而p10正是數(shù)組的定義形式,共有10個(gè)元素。最后p10與*結(jié)合,表示它的各元素可以指向一個(gè)整型變量。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,86,指針數(shù)組廣泛應(yīng)用于對(duì)字符串的處理例如有定義:char*p3;定義了一個(gè)具有三個(gè)元素p0,p1,p2的指針數(shù)組。每個(gè)元素都可以指向一個(gè)字符數(shù)組,或字符串。若利用數(shù)組初始化,則:char*p3=“Basic”,“c+”,“pascal”;p0指向字符串“Basic”;p1指向字符串“c+”;p2指向字符串“pascal”;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,87,其存儲(chǔ)結(jié)構(gòu)如圖8.15所示。p0指向字符串“BASIC”;p1指向字符串“C+”;p2指向字符串“PASCAL”;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,88,例8.9字符指針數(shù)組的賦值#defineNULL0main()staticchara=“Fortran”;staticcharb=“COBOL”;staticcharc=“Pascal”;inti;char*p4;p0=a;p1=b;p2=c;p3=NULL;for(i=0;pi!=NULL;i+)printf(“Language%dis%sn”,i+1,pi);,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,89,例8.10有若干本書,將書名按字典順序排序,#include#includemain()char*bname4="ProgramminginANSIC","BASIC","VisualC+6.0Programming","TRUBOC2.0"inti;voidsort(char*name,int);sort(bname,4);/*排序,改變指針的連接關(guān)系*/printf("n");for(i=0;i=1)printf(“n參數(shù)%d:%s”,i,*argv);i+;argc-;argv+;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,95,輸出結(jié)果:argc=4參數(shù)0:exam參數(shù)1:Turbo_c參數(shù)2:C+參數(shù)3:Vc程序開始運(yùn)行后,系統(tǒng)將命令行中字符串個(gè)數(shù)送argc,將四個(gè)字符串實(shí)參:exam、Turbo_c、C+、Vc的首地址分別傳給字符指針數(shù)組元素argv0、argv1、argv2、argv3。,若運(yùn)行該程序時(shí)的命令行輸入的是:examTurbo_cC+Vc,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,96,8.5指針與函數(shù),8.5.1指針變量作為函數(shù)參數(shù)利用指針作函數(shù)參數(shù),可以實(shí)現(xiàn)函數(shù)之間多個(gè)數(shù)據(jù)的傳遞,當(dāng)形參為指針變量時(shí),其對(duì)應(yīng)實(shí)參可以是指針變量或存儲(chǔ)單元地址。函數(shù)形參為指針變量,用指針變量或變量地址作實(shí)參。函數(shù)形參為指針變量,用指針變量作為函數(shù)的實(shí)參。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,97,例8.12編寫一個(gè)交換兩個(gè)變量的函數(shù),在主程序中調(diào)用,實(shí)現(xiàn)兩個(gè)變量值的交換。,#includemain()inta,b;int*pa,*pb;voidswap(int*p1,int*p2);/*函數(shù)聲明*/scanf(%d%d,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,98,voidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;,注意:被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。,程序運(yùn)行結(jié)果如下:輸入:1222輸出:a=22,b=12,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,99,(2)函數(shù)形參為指針變量,用變量地址作為函數(shù)的實(shí)參。,例8.13將例8.12中的函數(shù)調(diào)用改為用變量地址作為實(shí)參。voidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,100,main()inta,b;scanf(%d%d,程序運(yùn)行結(jié)果如下:輸入:1222輸出:a=22,b=12,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,101,該函數(shù)的功能是將形參p1和p2的指針值互相交換。雖然指針p1和p2的指針值被交換了,但由于指針變量的值也遵循單向傳遞的原則,不會(huì)因?yàn)橹羔樞螀⒅档母淖兌绊懙街羔槍?shí)參的值。主函數(shù)中變量a和b的值并沒有交換。因此,僅交換函數(shù)中指針形參的值,并不能交換a和b的值,這一點(diǎn)是初學(xué)者容易犯的錯(cuò)誤。,考慮:若函數(shù)寫為如下的形式voidswap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,102,另一個(gè)容易犯的錯(cuò)誤是將函數(shù)寫成如下形式:voidswap(int*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;,其中,將p也定義為指針變量,但由于在函數(shù)中并未對(duì)p賦初值,p的值是不確定的,即指向一個(gè)未知的存儲(chǔ)單元。此時(shí)對(duì)p的引用可能會(huì)導(dǎo)致不可預(yù)料的后果,因此,要特別小心。,總結(jié):為了利用被調(diào)用函數(shù)改變的變量值,應(yīng)該使用指針(或指針變量)作函數(shù)實(shí)參。其機(jī)制為:在執(zhí)行被調(diào)用函數(shù)時(shí),使形參指針變量所指向的變量的值發(fā)生變化;函數(shù)調(diào)用結(jié)束后,通過不變的實(shí)參指針(或?qū)崊⒅羔樧兞浚⒆兓闹当A粝聛怼?2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,103,8.5.2指針函數(shù),指針函數(shù)是指函數(shù)的返回值是指針的函數(shù)。指針函數(shù)的定義形式:類型標(biāo)識(shí)符*函數(shù)名(形參表)例如:int*fun(inta,intb)函數(shù)體語(yǔ)句,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,104,fun()函數(shù)即是一個(gè)指針函數(shù),要求返回值是一個(gè)int型指針,這時(shí)要求在函數(shù)體中有返回指針或地址的語(yǔ)句,形如:return(,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,105,例8.14分析如下程序main()inta,b,*p;int*max(intx,inty);int*maxp(int*,int*);scanf(“%d,%d”,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,106,int*max(intx,inty)ifx>yreturn(/*指針變量q作為指針函數(shù)的返回值,輸入:8,9輸出:max=9maxp=9,返回指針的函數(shù)是很有用的,在庫(kù)函數(shù)中有許多是返回指針值的,如字符串函數(shù)strcat()、strcpy(),動(dòng)態(tài)存儲(chǔ)分配函數(shù)malloc()、calloc()等,讀者應(yīng)熟練掌握。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,107,8.5.3指向函數(shù)的指針,一個(gè)函數(shù)包括一組指令序列,存儲(chǔ)在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址,稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址。可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這個(gè)函數(shù),這樣通過這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這種指針變量稱為指向函數(shù)的指針變量。定義指向函數(shù)的指針變量的一般形式為:類型標(biāo)識(shí)符(*指針變量名)();,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,108,例如:int(*p)();/*指針變量p可以指向一個(gè)整型函數(shù)*/float(*q)();/*指針變量q可以指向一個(gè)浮點(diǎn)型函數(shù)*/上面定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦以地址值才能引用。當(dāng)將某個(gè)函數(shù)的入口地址賦給指向函數(shù)的指針變量,就可用該指針變量來調(diào)用所指向的函數(shù)。函數(shù)名代表函數(shù)的入口地址,給函數(shù)指針賦初值:只需將函數(shù)名(函數(shù)的入口地址值)賦給指針變量即可。例如int(*p)();intmax(inta,intb);則有賦值語(yǔ)句:p=max;/*p指向函數(shù)max(),即將函數(shù)的入口地址值賦給指針變量p*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,109,這時(shí)我們就可以用指針來調(diào)用函數(shù)了,這種調(diào)用方式稱為間接調(diào)用。如:a=(*p)(m,n)這與前面所講的函數(shù)調(diào)用:a=max(m,n)是等價(jià)的。后者稱為直接調(diào)用。指針調(diào)用函數(shù)的一般形式為:(*指針變量)(實(shí)參表);如上例:m=(*p)(12,22);/*比較m=max(12,22);*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,110,例8.15函數(shù)max()用來求一維數(shù)組中元素的最大值,在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來實(shí)現(xiàn)。#include"stdio.h"#defineM8main()floatsumf,sump;floataM=11,2,-3,4.5,5,69,7,80;float(*p)();/*定義指向函數(shù)的指針p*/floatmax(floata,intn);/*函數(shù)聲明*/p=max;/*函數(shù)名(函數(shù)入口地址)賦給指針p*/sump=(*p)(a,M);/*用指針方式調(diào)用函數(shù)*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,111,sumf=max(a,M);/*用函數(shù)名調(diào)用max()函數(shù)*/printf("sump=%.2fn",sump);printf("sumf=%.2fn",sumf),floatmax(floata,intn)intk;floats;s=a0;for(k=1;k<n;k+)if(s0)r=m%base;/*求余數(shù)*/if(r<10)*p=r+48;/*小于10的數(shù)轉(zhuǎn)換成字符后送p指向的元素*/else*p=r+55;/*數(shù)1015轉(zhuǎn)換成AF后送p指向的元素*/m=m/base;p+;/*指針下移*/*p=0;/*在最后加上字符串結(jié)束標(biāo)志*/,輸入:Inputradix(2,8,16):16Inputapositiveinteger:435678輸出:6A5DE,

注意事項(xiàng)

本文(C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt)為本站會(huì)員(max****ui)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!