《C語言程序設(shè)計》第5章指針.ppt
《《C語言程序設(shè)計》第5章指針.ppt》由會員分享,可在線閱讀,更多相關(guān)《《C語言程序設(shè)計》第5章指針.ppt(45頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第五章指針Pointer,5.1指針的基本概念,指針是C語言的重要特征,是C語言訪問內(nèi)存數(shù)據(jù)和程序的靈活和有效的手段。,C語言的指針支持:函數(shù)的地址調(diào)用;動態(tài)分配內(nèi)存;數(shù)組的地址引用。,內(nèi)存、地址、指針(Memory,Address,Pointer),內(nèi)存存放了計算機正在運行的程序和程序正在使用的數(shù)據(jù)。內(nèi)存的基本單元是字節(jié)(Byte)。,為了訪問內(nèi)存單元,CPU給每個內(nèi)存單元一個編號,該編號稱為該內(nèi)存單元的地址。,變量是程序中可以改變的量,當說明變量時,系統(tǒng)將為其在內(nèi)存中開辟相應得內(nèi)存單元。由此確定變量的地址及內(nèi)存中的表示方式。,2000H,2001H,2002H,2003H,inta=0;,a的內(nèi)存單元,a的地址,標識符命名的指針變量名。,指針標志。,指針指向?qū)ο蟮念愋汀?int*p,*q;/*p、q是指向整型變量的指針。*/,float*pfValue,*pf;/*pfValue和pf是指向浮點型的指針。*/,指針對變量的引用,定義指針的目的是通過指針引用內(nèi)存對象,指針的引用應按如下步驟進行:,說明指針,inta=0,*p;,指針指向?qū)ο?p=,通過指針引用對象,*p=*p+2;,4.指針操作的兩種運算符:,取地址運算,2000H,a,p,p=/*p指向a。*/,2000H,*p=2;,2,舉例:,#includevoidmain(void)intx,*p;x=55;p=,2000H,x,p,2000H,55,65,關(guān)于指針的說明:,指針必須指向?qū)ο蠛?,才能引用?int*p;*p=2;/*Error!*/,p=則:p1=,5。指針的運算,指針是特殊類型的變量,其內(nèi)容是變量的地址,因此指針的運算及結(jié)果一定要符合地址邏輯。,五種算術(shù)運算,inta,b,*p1,*p2;p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+;/*含義指向a后的整型單元*/,2002H,2002H,p1-;/*指向a前的整型單元*/,p1+n;/*指向a后的第n個整型單元*/,p1-n;/*指向a前的第n個整型單元*/,p2-p1;/*a和b之間差的單元數(shù)*/,結(jié)果200H,pn相當于:p的實際內(nèi)容nsizeof(*p);,六種關(guān)系運算,比較兩個同類型變量之間的地址關(guān)系。,p1p2;,指針賦值運算,#includevoidmain(void)inta,b,*p1,*p2;a=2;b=3;p1=,差別,a,指針指向數(shù)組,p=a;/*指向數(shù)組的首地址*/p=/*指向數(shù)組的首地址*/,通過指針引用數(shù)組元素,當指針指向數(shù)組的首地址時,則下標為i的元素地址為:p+i或a+i,引用數(shù)組元素可以有三種方法:,下標法:ai指針法:*(p+i)數(shù)組名法:*(a+i),注意:數(shù)組名是地址常量,不能改變!,a=p;/*Error!*/,/*example5-2通過指針訪問數(shù)組元素*/#includevoidmain(void)doubledArray10,dAvge,*dPointer;inti;dAvge=0;dPointer=dArray;/*指針指向數(shù)組*/for(i=0;i10;i+)scanf(%lf,dPointer+i);/*dPointer+i為下標為i的元素地址*/dAvge+=*(dPointer+i);/*累加各個元素的值*/dAvge/=10;printf(Theavgerageofarrayis:%lfn,dAvge);,【例5-2】有一個具有10個元素的雙精度數(shù)組,通過指針求其所有元素的平均值。,/*example5-3通過指針求數(shù)組元素最大值及其位置*/#includevoidmain(void)intiArray10,*ipCur;/*ipCur遍歷訪問數(shù)組的指針*/int*ipPos;/*ipPos最大元素地址*/inti;ipCur=iArray;/*指針指向數(shù)組*/for(i=0;i10;i+)scanf(%d,ipCur+);/*ipCur為下標為i的數(shù)組元素的地址*/ipPos=iArray;/*指向數(shù)組首地址*/*設(shè)下標為0的元素為最大值*/ipCur=iArray+1;,【例5-3】通過指針求數(shù)組的最大值及其位置。,for(i=1;i*ipPos)ipPos=ipCur;/*ipPos保存最大元素的地址*/ipCur+;/*指向下一元素*/printf(Themaxis%dn,*ipPos);printf(Thepositionis%dn,ipPos-iArray);,舉例:打印數(shù)組中的奇數(shù)。,#includevoidmain(void)inti,a10;for(i=0;i10;i+)scanf(“%d”,數(shù)組元素法。,循環(huán)輸入。,循環(huán)判斷,滿足條件輸出。,數(shù)組名法。,a+i,*(a+i),指針法。,*p;,p=a;,p+,*(p+i),結(jié)果是否正確?,p=a;*p=*,注意指針在運算時的變化。,2.指針與二維數(shù)組,如下說明數(shù)組inta34=1,2,3,4,5,6,7,8,9,10,11,12;,其二維結(jié)構(gòu)如下:,行,列,為了便于索引,C語言將數(shù)組分為兩級管理。,a0,a1,a2,將a理解為一維數(shù)組,數(shù)組有三個元素,它們分別為a0、a1,a2。各個元素又是一個有四個元素的一維數(shù)組。,從地址的角度看:a為a0第一行的首地址a+1為a1第二行的首地址a+2為a2第三行的首地址,a+1地址一次加一行。,i行j列數(shù)組元素的地址可以由ai+j得到。,數(shù)組名地址的兩級管理,a,a0,a1,a2,a00a01a02a03,a10a11a12a13,a20a21a22a23,等價地址及其管理方式,數(shù)組名是數(shù)組的地址,而且是常量,*運算不改變其值!,以下三種地址等價:,a+i,*(a+i),ai,加法按行遞增,加法按列遞增,(a+1)+1,*(a+1)+1,差別?,數(shù)組名表示數(shù)組元素,aij,(*(a+i)j,*(*(a+i)+j),*(ai+j),指針與二維數(shù)組,int*p,a34;p=a;aij*(p+4*i+j)等價!,a00,a,a01,a02,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,/*example5-4求二維數(shù)組最小值及其位置*/#includevoidmain(void)inta34,i,j;intiMinRow,iMinCol;/*iMinRow最小值的行,iMinCol最小值的列*/for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,ai+j);/*ai+j為i行j列元素的地址*/iMinRow=0;iMinCol=0;/*假定a00為最小值*/for(i=0;i3;i+)for(j=0;j4;j+)if(*(*(a+i)+j)aiMinRowiMinCol)iMinRow=i;iMinCol=j;/*修正i和j為新的最小值下標*/printf(Theminisa%d%d=%dn,iMinRow,iMinCol,aiMinRowiMinCol);,【例5-4】輸入三行四列的整型數(shù)組,求最小值及其位置。,/*example5-5通過指針求二維數(shù)組元素的累加和*/#includevoidmain(void)inti,j,a23,sum;int*p;p=(int*)a;/*p指向數(shù)組a,由于a加1加1行,轉(zhuǎn)換為整型指針*/for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,ai+j);/*ai+j為i行j列元素的地址*/sum=0;for(i=0;i2;i+)for(j=0;j3;j+)sum+=*(p+i*3+j);/*通過指針p表示aij*/printf(Thesumofa=%dn,sum);,【例5-5】輸入兩行三列的整型數(shù)組,通過指針求所有元素的累加和。,舉例:在數(shù)組a中查找輸入的數(shù),輸出行列位置。,#includevoidmain(void)inta34=1,2,3,4,5,6,7,8,9,10,11,12;inti,j,iS;int*p;p=a;scanf(“%d”,下標法。,*(ai+j),*(*(a+i)+j),*(p+4*i+j),【例5-6】輸入3行4列的浮點型數(shù)組,通過指針求數(shù)組的平均值。,/*example5-6通過指針求二維數(shù)組的平均值*/#includevoidmain(void)inti,j;floata34,fAvg;float(*p)4;p=a;/*指針指向數(shù)組*/fAvg=0;for(i=0;i=A,舉例:將無符號的八進制字符串轉(zhuǎn)換為十進制整數(shù)。,#includevoidmain(void)char*p,s6;inti,n=0;p=s;gets(p);for(;*p!=0;p+)n=n*8+*p-0;printf(“%dn”,n);,p指向s數(shù)組。,輸入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,思考題:將4位十六進值字符串轉(zhuǎn)化為十進制字符串。,5.4指針數(shù)組和指向指針的指針,指針是存放其它數(shù)據(jù)對象地址的變量。因此,指針可以構(gòu)成數(shù)組。每個數(shù)組元素為一個指針變量,且在內(nèi)存中連續(xù)存放。,指針數(shù)組的說明,說明格式:type*數(shù)組名constexp;,int*p4;,含義是在內(nèi)存中開辟空間,并指明元素所指向的對象的類型。,數(shù)組名p為數(shù)組的地址。,使用前必須讓各元素指向?qū)ο蟆?inti,a34,*p3;for(i=0;i3;i+)pi=ai;*(p2+1)=2;/*通過指針數(shù)組引用數(shù)組元素a21*/,/*example5-9通過指針數(shù)組訪問二維數(shù)組*/#includevoidmain(void)inta34;int*p3;/*說明行數(shù)相同的指針數(shù)組*/inti,j;intiSumOfPosi,iCountOfPosi;for(i=0;i3;i+)pi=ai;/*指針數(shù)組元素指向?qū)男?/for(j=0;j4;j+)scanf(%d,pi+j);iSumOfPosi=0;iCountOfPosi=0;,【例5-9】統(tǒng)計3行4列整型二維數(shù)組中正數(shù)的個數(shù),并求正數(shù)的累加和,輸出結(jié)果。,for(i=0;i0)iSumOfPosi+=*(pi+j);/*通過指針數(shù)組訪問二維數(shù)組*/iCountOfPosi+;printf(Thesumofposi-numbinarrayis%dn,iSumOfPosi);printf(Thenumberofposi-numbinarrayis%dn,iCountOfPosi);,指針數(shù)組的應用舉例,指針數(shù)組與多維數(shù)組,通過指針數(shù)組按數(shù)學方式輸出數(shù)組的值。,#includevoidmain()inti,j;inta34=1,2,3,4,5,6,7,8,9,10,11,12;int*p3;p0=a0;p1=a1;p2=a2;for(i=0;i3;i+)for(j=0;j4;j+)printf(“%5d”,*(pi+j);printf(“n”);,p0,數(shù)組a的二維結(jié)構(gòu),p1,p2,a0,a1,a2,每輸出一行,打印回車。,/*example5-10通過指針數(shù)組訪問二維字符數(shù)組*/#include#includevoidmain(void)charstrName510,*strP5,*strTemp=NULL;inti,j;for(i=0;i0)/*比較*/,【例5-10】對存放于二維字符數(shù)組中的五個字符串按由小到大排序輸出。,strTemp=strPi;strPi=strPj;strPj=strTemp;printf(Theresultaftersort:n);for(i=0;i5;i+)puts(strPi);/*輸出*/,指針數(shù)組與多字符串,通過指針數(shù)組構(gòu)成的菜單,執(zhí)行DOS命令。,#includevoidmain(void)char*command=“dir”,“time”,“date”,ch;for(;)doprintf(“1:directoryn”);printf(“2:settimen”);printf(“3:setdaten”);printf(“4:quitn”);printf(nselection:”);ch=getchar();printf(“n”);while(ch4);if(ch=4)break;system(commandch-1);,內(nèi)層循環(huán)輸入選項,外層循環(huán)根據(jù)選項執(zhí)行命令,執(zhí)行系統(tǒng)命令函數(shù),如:system(“dir”);,3-12,【例5-11】輸入0到6的數(shù)字分別代表周日到周六,輸出英文名稱。,/*example5-11字符型指針數(shù)組與字符串常量*/#includevoidmain(void)char*strDay7=“Sunday”,“Monday”,“Tuesday”,Wednesday,Thursday,Friday,Saturday;intiDay;scanf(%d,指向指針的指針,如果指針變量的內(nèi)容存放其它指針的地址,稱該指針為指向指針的指針。,指向指針的指針的說明:,形式:type*p;,int*p;,p是一個指向整形指針的指針。,#includevoidmain(void)intx,*p,*q;x=10;p=,p為指向整型的指針。,q為指向整型指針的指針。,x,p,q,2000H,3000H,10,2000H,3000H,指向指針的指針的應用,指向指針的指針一般用于多維數(shù)組和指針數(shù)組的操作。,多維數(shù)組,#includevoidmain()inta34=1,2,3,4,5,6,7,8,9,10,11,12,;int*arr3=a0,a1,a2;inti,j,*p;p=arr;for(i=0;i3;i+)for(j=0;i4;j+)printf(“%5d”,*(*(p+i)+j);printf(“n”);,ai,aij,arr,arr,p,p+1,【例5-12】指向指針的指針的簡單應用。,/*example5-12通過指向指針的指針訪問簡單變量示例*/#includevoidmain(void)intx,*p,*q;/*說明變量、指針、指向指針的指針*/x=20;p=/*引用指向的對象*/,/*example5-13通過指向指針的指針與指針數(shù)組訪問二維數(shù)組*/#includevoidmain(void)inta34,*p3,*pp;/*說明二維數(shù)組及與其行數(shù)相同的指針數(shù)組*/inti,j;floatiAvg;for(i=0;i3;i+)pi=ai;/*指針數(shù)組元素指向?qū)男?/for(j=0;j4;j+)scanf(%d,pi+j);pp=p;/*pp指向指針數(shù)組*/iAvg=0;for(i=0;i3;i+)for(j=0;j4;j+)iAvg+=*(*(pp+i)+j);/*通過pp訪問aij*/printf(Theaverageofais%fn,iAvg/12);,【例5-13】通過指向指針的指針與指針數(shù)組,求二維數(shù)組的平均值。,用于處理多字符串,#includevoidmain(void)char*name=“one”,“two”,“three”,“four”;char*p;inti;for(i=0;i4;i+)p=name+i;printf(“%sn”,*p);,p,name+i,指針的類型問題,通過指針可以訪問基本類型的變量及數(shù)組,指針的類型是其指向數(shù)據(jù)的類型,該類型決定了指針邏輯加一時所加的物理字節(jié)數(shù)。,可以強制轉(zhuǎn)換指針的類型,轉(zhuǎn)換方式為:,(type*)p,#includevoidmain()chara3,*p;inty;a0=0 x12;a1=0 x34;a2=0 x56;p=,&a0,p,相鄰單元轉(zhuǎn)化為一個整型單元。,chp5ex2,*p,指向void類型的指針,void稱為“空類型”,void不能說明變量。但可以用void說明指針。當用void說明指針時,指針稱為指向空類型的指針,空類型指針加1,地址移動一個字節(jié)。也就是說void指向的類型是以物理字節(jié)為單位的內(nèi)存。,5.5程序代碼風格,1.命名規(guī)范,標識符是C語言的命名機制,標識符可以對變量、數(shù)組、函數(shù)、結(jié)構(gòu)類型、宏名等需要命名的數(shù)據(jù)命名。為了提高程序的可讀性,命名一般的規(guī)則如下:,(1)宏名宏名一般全部由大寫字母構(gòu)成,以示與其他數(shù)據(jù)名字的區(qū)別,(2)函數(shù)名函數(shù)命名最好采用動詞短語加名詞短語,每個短語的首字符用大寫表示。主要目的是盡可能在名字中描述函數(shù)實現(xiàn)的功能。,(3)變量名變量的名是程序中使用最多的名字,變量的命名應盡可能的做到“見名知意”,也就是在命名中盡可能體現(xiàn)變量在程序中的作用,同時變量的名字中最好能體現(xiàn)變量的類型。業(yè)界較為通行的是Windows程序員的規(guī)范,該規(guī)范是也稱“匈牙利命名法”,是匈牙利人CharlesSimonyi提出的命名方式。該方式以小寫字母構(gòu)成的前綴表示類型,以一個或多個名詞短語表示變量的含義,每個名詞短語的首字符為大寫,表達式及語句風格,1.表達式,表達式要盡量簡單易讀,在程序中不要用過于復雜的表達式。,2.語句中的風格在分支和循環(huán)的語句中,無論是否需要都加包含其語句。,3.空行在語句中加入適當空行表示某個操作的結(jié)束,以增加程序的可讀性。,4.注釋在程序中加入注釋對于提高程序的可讀性、可調(diào)性、可維護性都是十分必要的,因此在程序關(guān)鍵算法、關(guān)鍵語句、關(guān)鍵位置都應該加必要的注釋。,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- C語言程序設(shè)計 語言程序設(shè)計 指針
鏈接地址:http://www.szxfmmzy.com/p-11498721.html