C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt
《C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序設(shè)計(jì)實(shí)用教程第8章.ppt(120頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
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ī)則,掌握用指針訪問(wèn)變量、一維數(shù)組和二維數(shù)組的方法,以及用指針處理字符串的方法。通過(guò)多編程、多上機(jī)調(diào)試程序來(lái)體會(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ǔ)單元,為了便于訪問(wèn),給每個(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è)變量都通過(guò)變量名與相應(yīng)的存儲(chǔ)單元相連系,具體分配哪些單元給變量,由C編譯系統(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(用來(lái)存放地址的)分配的存儲(chǔ)空間地址是4800,p中保存的是變量a的地址,即4000,當(dāng)要讀取a變量的值12345時(shí),不是直接通過(guò)a變量,也不是直接通過(guò)保存12345的內(nèi)存單元的地址4000去取值,而是先通過(guò)變量p得到p的值4000,即a的地址,再根據(jù)地址4000讀取它所指向單元的值12345。,這種間接的通過(guò)變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取”。通常稱變量p指向變量a,變量a是變量p所指向的對(duì)象,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,7,4、變量值的存取──通過(guò)變量在內(nèi)存中的地址進(jìn)行存取,系統(tǒng)執(zhí)行“scanf(”%d“,”時(shí),存取變量a值的方式可以有兩種:直接訪問(wèn)──直接利用變量的地址進(jìn)行存取。1)上例中scanf(“%d”,(定義p1為指向?qū)嵭妥兞康闹羔樧兞?char*p2;(定義p2為指向字符型變量的指針變量)在指針變量定義中,*是一個(gè)說(shuō)明符,它表明其后的變量是指針變量,如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)檫@些指針變量還沒(méi)有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(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還沒(méi)有被賦值,因此pa、pb沒(méi)有指向任何變量,下面語(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,(3)給指針變量賦空值,給指針變量賦空值,說(shuō)明該指針不指向任何變量?!翱铡敝羔樦涤肗ULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為0,在使用時(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í)際意義。例如:inta[10],*p=a,*x;x=p+3;/*實(shí)際上是p加上3*2個(gè)字節(jié)賦給x,x指向數(shù)組的第三個(gè)分量*/對(duì)于不同基類型的指針,指針變量“加上”或“減去”一個(gè)整數(shù)n所移動(dòng)的字節(jié)數(shù)是不同的。例如:floata[10],*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)小心。例如:inta[10],*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。也就是說(shuō),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.通過(guò)指針引用數(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(){inta[10];inti;for(i=0;i<10;i++)scanf("%d",},(2)通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,37,(3)用指針變量指向數(shù)組元素main(){inta[10];int*p,i;for(i=0;i<10;i++)scanf("%d",},三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而用指針?lè)▌t執(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++)是先輸出a[0],再讓p指向a[1];輸出*(++p)是先使p指向a[1],再輸出p所指的a[1]。(5)(*p)++表示的是將p指向的變量值+1,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í),可有4種等價(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ù)按相反順序存放。,算法為:將a[0]與a[n-1]對(duì)換,再a[1]與a[n-2]對(duì)換…,直到將a[(n-1/2)]與a[n-int((n-1)/2)]對(duì)換。今用循環(huán)處理此問(wèn)題,設(shè)兩個(gè)“位置指示變量”i和j,i的初值為0,j的初值為n-1。將a[i]與a[j]交換,然后使i的值加1,j的值減1,再將a[i]與a[j]交換,直到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=x[i];x[i]=x[j];x[j]=temp;}return;},2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,44,main(){inti,a[10]={3,7,9,11,0,6,7,5,4,2};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");inv(a,10);/*實(shí)參是數(shù)組名*/printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);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就指向a[0]。x+m是a[m]元素的地址。設(shè)i和j以及p都是指針變量,i指向x,j指向x+n-1,使*i與*j交換就是使a[i]與a[j]交換。見(jiàn)下例。,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,a[10]={3,7,9,11,0,6,7,5,4,2};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");inv(a,10);/*實(shí)參是數(shù)組名*/printf("Thearrayhasbenninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");},運(yùn)行情況與前一程序相同。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,48,歸納起來(lái),如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種:形參和實(shí)參都是數(shù)組名。如:main(){inta[10];…f(a,10)…},f(intx[],intn){…}這時(shí)形參x和實(shí)參a共用一段內(nèi)存單元。,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,49,實(shí)參用數(shù)組,形參用指針變量。如:main(){inta[10];…f(a,10)…},f(int*x,intn){…},2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,50,實(shí)參、形參都用指針變量。如:main(){inta[10],*p=a;…f(p,10)…},f(int*x,intn){…},2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,51,實(shí)參為指針變量,形參為數(shù)組名。如:main(){inta[10],*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,a[10]={3,7,9,11,0,6,7,5,4,2};printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");p=a;sort(p,10);for(p=a;py}return(/*指針變量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ù),這樣通過(guò)這個(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ù)的指針變量,就可用該指針變量來(lái)調(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í)我們就可以用指針來(lái)調(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()用來(lái)求一維數(shù)組中元素的最大值,在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來(lái)實(shí)現(xiàn)。#include"stdio.h"#defineM8main(){floatsumf,sump;floata[M]={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);/*用指針?lè)绞秸{(diào)用函數(shù)*/,2020/4/25,C語(yǔ)言程序設(shè)計(jì)教程,111,sumf=max(a,M);/*用函數(shù)名調(diào)用max()函數(shù)*/printf("sump=%.2f\n",sump);printf("sumf=%.2f\n",sumf)},floatmax(floata[],intn){intk;floats;s=a[0];for(k=1;k- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語(yǔ)言程序設(shè)計(jì) 實(shí)用教程
鏈接地址:http://www.3dchina-expo.com/p-11494836.html