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

C語言程序設計實用教程第8章.ppt

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

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

C語言程序設計實用教程第8章.ppt

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

注意事項

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

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




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

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

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


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