C語言程序設(shè)計實用教程第8章.ppt
《C語言程序設(shè)計實用教程第8章.ppt》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計實用教程第8章.ppt(120頁珍藏版)》請在裝配圖網(wǎng)上搜索。
2020/4/25,C語言程序設(shè)計教程,1,8.1指針與指針變量8.2指向數(shù)組的指針變量8.3指向字符串的指針變量8.4指針數(shù)組與命令行參數(shù)8.5指針與函數(shù)8.6指針小結(jié),第8章指針,2020/4/25,C語言程序設(shè)計教程,2,,教學提示“指針”是C語言中廣泛使用的一種數(shù)據(jù)類型,運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu),實現(xiàn)動態(tài)內(nèi)存分配,不但能很方便地使用數(shù)組和字符串,還能像匯編語言一樣處理內(nèi)存地址,從而編出精練而高效的程序。但是,由于指針概念較復(fù)雜,使用較靈活,初學者常常感到較難理解,因此,學習時必須從指針的概念入手,正確理解指針及指針在數(shù)組和函數(shù)方面的應(yīng)用。教學目標要求學生掌握指針的概念和運算規(guī)則,掌握用指針訪問變量、一維數(shù)組和二維數(shù)組的方法,以及用指針處理字符串的方法。通過多編程、多上機調(diào)試程序來體會指針的概念及其使用的規(guī)律,并應(yīng)用于實際的編程中。,2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,4,2、變量、變量名、變量的地址、變量值每個變量都通過變量名與相應(yīng)的存儲單元相連系,具體分配哪些單元給變量,由C編譯系統(tǒng)完成變量名到對應(yīng)內(nèi)存單元地址的變換。變量分配存儲空間的大小由類型決定。變量的值則是指相應(yīng)存儲單元的內(nèi)容。,2020/4/25,C語言程序設(shè)計教程,5,3、指針、變量的指針和指針變量指針:就是“內(nèi)存單元的地址”。指針指向一個內(nèi)存單元。變量的指針:就是“變量的地址”。變量的指針指向一個變量對應(yīng)的內(nèi)存單元。指針變量:就是地址變量。地址(指針)也是數(shù)據(jù),可以保存在一個變量中。保存地址(指針)數(shù)據(jù)的變量稱為指針變量。,2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,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語言程序設(shè)計教程,12,(1)指針運算符與地址運算符與指針引用有關(guān)的兩個運算符:語句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。因為這些指針變量還沒有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(nèi)存單元)。指針變量初始化:在定義指針時同時給指針一個初始值如:inta,*p=,2020/4/25,C語言程序設(shè)計教程,14,8.1.3指針變量的引用,與指針引用有關(guān)的兩個運算符:(1)float*pf;第一行定義了整型變量a,b及指針變量pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變量,下面語句完成對pa,pb的賦值:pa=,2020/4/25,C語言程序設(shè)計教程,17,例如:intj,k;int*pointer1,*pointer2;pointer1=,2020/4/25,C語言程序設(shè)計教程,18,(2)相同類型的指針變量間的賦值,pa與pb都是整型指針變量,它們間可以相互賦值,如:pb=pa;即pa,pb都指向變量a,此時a、*pa、*pb是等價的。指針指向變化如下圖:,注意:只有相同類型的指針變量才能相互賦值,如pf=pa;是不允許的。因為pa是整型指針,pf是浮點型指針。,2020/4/25,C語言程序設(shè)計教程,19,(3)給指針變量賦空值,給指針變量賦空值,說明該指針不指向任何變量?!翱铡敝羔樦涤肗ULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為0,在使用時應(yīng)加上預(yù)定義行,如:#include"stdio.h"int*pa=NULL;亦可以用下面的語句給指針賦“空值”:pa=0;或:pa=’\0’;這里指針pa并非指向0地址單元,而是具有一個確定的“空值”,表示pa不指向任何變量。注意:指針雖然可以賦值0,但卻不能把其它的常量地址賦給指針。例如:pa=4000;是非法的。,2020/4/25,C語言程序設(shè)計教程,20,例8.1指針定義與初始化,main(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=},2020/4/25,C語言程序設(shè)計教程,21,程序運行結(jié)果:100,10100,10,2020/4/25,C語言程序設(shè)計教程,22,例8.2從鍵盤上輸入兩個整數(shù)到a、b,按由大到小輸出。,#includemain(){inta,b,*pa=/*pa指向大數(shù),pb指向小數(shù)*/},2020/4/25,C語言程序設(shè)計教程,23,若輸入:1222↙輸出結(jié)果:a=12,b=22max=22,min=12,(b)(c)指針變化示意圖,2020/4/25,C語言程序設(shè)計教程,24,2.指針的算術(shù)運算,(1)加減運算:一個指針可以加、減一個整數(shù)n,其結(jié)果與指針所指對象的數(shù)據(jù)類型有關(guān)。指針變量的值應(yīng)增加或減少“nsizeof(指針類型)”。加減運算常用于數(shù)組的處理。對指向一般數(shù)據(jù)的指針,加減運算無實際意義。例如:inta[10],*p=a,*x;x=p+3;/*實際上是p加上3*2個字節(jié)賦給x,x指向數(shù)組的第三個分量*/對于不同基類型的指針,指針變量“加上”或“減去”一個整數(shù)n所移動的字節(jié)數(shù)是不同的。例如:floata[10],*p=a,*x;p=p+3;/*實際上是p加上3*4個字節(jié)賦給x,x依然指向數(shù)組的第三個分量*/,2020/4/25,C語言程序設(shè)計教程,25,(2)自增自減運算,指針變量自增、自減運算具有上述運算的特點,但有前置后置、先用后用的考慮,務(wù)請小心。例如:inta[10],*p=a,*x;x=p++;/*x第一個元素分量,p指向第二個元素*/x=++p;/*x、p均指向數(shù)組的第二個分量*/*p++相當于*(p++)。*(p++)與(*p)++含義不同,前者表示地址自增,后者表示當前所指向的數(shù)據(jù)自增。,2020/4/25,C語言程序設(shè)計教程,26,2.*執(zhí)行了“p=int*p;p=(把數(shù)組的首地址賦給指針變量p),p=把a[0]元素的地址賦給指針變量p。也就是說,p指向a數(shù)組的第一個元素。,2020/4/25,C語言程序設(shè)計教程,30,2020/4/25,C語言程序設(shè)計教程,31,C語言規(guī)定:數(shù)組名代表數(shù)組首地址,是一個地址常量。因此,下面兩個語句等價:p=兩句。,2020/4/25,C語言程序設(shè)計教程,32,指向數(shù)組的指針變量p,a+0,p+1或a+1,,p+9或a+9,,*(a+9)或*(p+9),2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,36,main(){inta[10];inti;for(i=0;i<10;i++)scanf("%d",},(2)通過數(shù)組名計算數(shù)組元素地址,輸出元素的值,2020/4/25,C語言程序設(shè)計教程,37,(3)用指針變量指向數(shù)組元素main(){inta[10];int*p,i;for(i=0;i<10;i++)scanf("%d",},三種方法的比較:用下標法比較直觀,能直接知道是第幾個元素;而用指針法則執(zhí)行效率更高。,2020/4/25,C語言程序設(shè)計教程,38,使用指針變量時,應(yīng)注意:(1)指針變量可實現(xiàn)使本身的值改變。P++合法;但a++不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運行中是固定不變的。)(2)要注意指針變量的當前值。,2020/4/25,C語言程序設(shè)計教程,39,(3)*p++相當于*(p++),因為*與++優(yōu)先級相同,且結(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語言程序設(shè)計教程,40,8.2.3用數(shù)組名作函數(shù)參數(shù),用數(shù)組名作函數(shù)參數(shù)時,由于數(shù)組名代表的是數(shù)組起始地址,因此傳遞的值是數(shù)組首地址,所以要求形參為指針變量。引入指向數(shù)組的指針變量后,數(shù)組及指向數(shù)組的指針變量作函數(shù)參數(shù)時,可有4種等價形式(本質(zhì)上是一種,即指針數(shù)據(jù)作函數(shù)參數(shù)):(1)形參、實參都用數(shù)組名(2)形參、實參都用指針變量(3)形參用指針變量、實參用數(shù)組名(4)形參用數(shù)組名、實參用指針變量,2020/4/25,C語言程序設(shè)計教程,41,例8.4將數(shù)組a中n個整數(shù)按相反順序存放。,算法為:將a[0]與a[n-1]對換,再a[1]與a[n-2]對換…,直到將a[(n-1/2)]與a[n-int((n-1)/2)]對換。今用循環(huán)處理此問題,設(shè)兩個“位置指示變量”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語言程序設(shè)計教程,42,2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,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ù)組名*/printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");},2020/4/25,C語言程序設(shè)計教程,45,對例8.4作一些改動,將函數(shù)inv中的形參x改成指針變量。實參為數(shù)組名a,即數(shù)組a的首地址,將它傳給形參指針變量x,這時x就指向a[0]。x+m是a[m]元素的地址。設(shè)i和j以及p都是指針變量,i指向x,j指向x+n-1,使*i與*j交換就是使a[i]與a[j]交換。見下例。,2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,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ù)組名*/printf("Thearrayhasbenninverted:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");},運行情況與前一程序相同。,2020/4/25,C語言程序設(shè)計教程,48,歸納起來,如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實參與形參的對應(yīng)關(guān)系有以下4種:形參和實參都是數(shù)組名。如:main(){inta[10];…f(a,10)…},f(intx[],intn){…}這時形參x和實參a共用一段內(nèi)存單元。,2020/4/25,C語言程序設(shè)計教程,49,實參用數(shù)組,形參用指針變量。如:main(){inta[10];…f(a,10)…},f(int*x,intn){…},2020/4/25,C語言程序設(shè)計教程,50,實參、形參都用指針變量。如:main(){inta[10],*p=a;…f(p,10)…},f(int*x,intn){…},2020/4/25,C語言程序設(shè)計教程,51,實參為指針變量,形參為數(shù)組名。如:main(){inta[10],*p=a;…f(p,10)…},以上四種方法,本質(zhì)上都是地址的傳遞。其中(1)(4)兩種只是形式上的不同,實際上都是使用指針變量。,f(intx[],intn){…},2020/4/25,C語言程序設(shè)計教程,52,例8.6用選擇法對10個整數(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ù)是很有用的,在庫函數(shù)中有許多是返回指針值的,如字符串函數(shù)strcat()、strcpy(),動態(tài)存儲分配函數(shù)malloc()、calloc()等,讀者應(yīng)熟練掌握。,2020/4/25,C語言程序設(shè)計教程,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語言程序設(shè)計教程,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語言程序設(shè)計教程,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語言程序設(shè)計教程,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;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);/*用指針方式調(diào)用函數(shù)*/,2020/4/25,C語言程序設(shè)計教程,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.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語言程序設(shè)計 實用教程
鏈接地址:http://www.820124.com/p-11494836.html