計(jì)算機(jī)第九章_第1頁
計(jì)算機(jī)第九章_第2頁
計(jì)算機(jī)第九章_第3頁
計(jì)算機(jī)第九章_第4頁
計(jì)算機(jī)第九章_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第九章 指針一、什么是指針?變量變量的內(nèi)容變量的地址指針地址

如果有一個(gè)變量專門來存放另一個(gè)變量的地址,則稱該變量為:指針變量。變量的指針就是變量地址。如:int*pointer_1;/*定義指向整型變量的指針變量*/float*pointer_2;/*定義指向?qū)嵭妥兞康闹羔樧兞?/

指針類型定義了該指針可以指向的變量類型;即:指針變量的類型必須與指向變量的類型一致。二、指針變量的定義:一般形式:類型標(biāo)識(shí)符*標(biāo)識(shí)符三、指針運(yùn)算符:*和&&:返回變量的內(nèi)存地址。取變量的地址。單目運(yùn)算*和&可以結(jié)合使用,但必須按“自右到左”(右結(jié)合)p=&a*pa&*p&a

*:返回某地址中變量的值。取指向變量的內(nèi)容。例如:inta,*p;四、指針的賦值1、賦定值:#include“stdio.h”int*p=NULL;

定義了指針變量后,并不指向任何存儲(chǔ)單元,須通過賦值使指針指向某一存儲(chǔ)單元2、賦變量的地址:

intj,k;int*pointer_1,*pointer_2;/*指向整型變量的指針變量*/pointer_1=&j;pointer_2=&k;

變量的地址;數(shù)組名;數(shù)組中數(shù)組元素的地址;函數(shù)的入口地址(函數(shù)名);指針間賦值;給指針賦值的方法大體上有:例9.1將兩個(gè)數(shù)由大到小排序main(){int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;變量的地址的賦值p1p2a23b34pif(a<b){p=p1;p1=p2;p2=p;}printf(“%d,%d”,a,b);/*a,b的值未交換*/printf(“%d,%d”,*p1,*p2);}指針間賦值五、指針的移動(dòng)只對指向數(shù)組、字符串、結(jié)構(gòu)體的指針變量有效。(int*p;)p++使指針指向它的對象的下一個(gè)元素的內(nèi)存位置;該表達(dá)式的結(jié)果為原來的p值。P--使指針指向它的對象的前一個(gè)元素的內(nèi)存位置;該表達(dá)式的結(jié)果為原來的p值。p+i使指針指向它的對象的下面的第i個(gè)元素的內(nèi)存位置;P-i使指針指向它的對象的前面的第i個(gè)元素的內(nèi)存位置;注意:i不允許是實(shí)型,只能是整型。++p使指針指向它的對象的下一個(gè)元素的內(nèi)存位置;該表達(dá)式的結(jié)果為p+1。--P使指針指向它的對象的前一個(gè)元素的內(nèi)存位置;該表達(dá)式的結(jié)果為p-1值。六、指針的使用1、用指針來訪問變量例9.2:若有說明:int*p,m=5,n;以下正確的程序段是:

A)p=&n;B)p=&n;

scanf(“%d”,&p)scanf(“%d”,*p)

C)scanf(“%d”,&p)D)p=&n;

p=&n;*P=m;D六、指針的使用例9.3:閱讀程序,寫出運(yùn)行結(jié)果。#include<stdio.h>main(){inta,b=100,*p1,*p2;p1=&a,p2=&b;*p1=++*p2;printf("%6d%5d",a,*p2);}101101#include<stdio.h>main(){inti=4,j=6,k=8,*p=&i,*q=&j,*r=&k;intx,y,z;x=p==&i;y=3*-*p/(*q)+7;z=*(r=&k)=*p**q;printf("x=%d,y=%d,z=%d\n",x,y,z);}例9.4寫出下列程序的運(yùn)行結(jié)果x=1,y=5,z=24=3*-4/6+7=-12/6+7=(*p)*(*q)2、用指針來訪問數(shù)組元素617456423124216989ap賦值:p=a;或p=&a[0];p+i就是a[i]元素相應(yīng)的存儲(chǔ)單元的地址,或者說p+i指向a[i],所以,p+i&a[i]注意:無論是什么類型的數(shù)組,數(shù)組名實(shí)質(zhì)是指針(數(shù)組指針)p+j和a+j都是

a[j]的地址*(p+j),*(a+j)代表:a[j]例9.5.定義inta[]={1,2,3,4},y,*p=&a[1];

執(zhí)行y=(*--p)++后,y的值為

。11數(shù)組中數(shù)組元素的地址賦值數(shù)組名賦值例9.6.定義intb[]={1,2,3,4},y,*p=b;

執(zhí)行y=*p++后,y的值為

。

#include<stdio.h>main(){inta[10],*p;for(p=a;p<a+10;p++)scanf("%d",p);printf("\n");for(p=a;p<a+10;p++)printf("%4d",*p);}

例9.7用指針輸入輸出一維數(shù)組的所有的元素:輸入:1、指針賦初值;

2、給出終止條件;

3、指針自加。輸出:1、重新給指針賦初值;

2、給出終止條件;

3、指針自加。注意:scanf語句與printf語句中的輸入對象和輸出對象的寫法。例9.8:用指針對數(shù)組元素進(jìn)行排序。main(){inta[10],*p,*q,i,t;for(i=0;i<10;i++)scanf("%d",&a[i]);for(p=a;p<a+9;p++)for(q=p+1;q<a+10;q++)if(*p>*q){t=*p;*p=*q;*q=t;}for(i=0;i<10;i++)printf("%4d",a[i]);}for(p=a;p<a+9;p++)for(q=p+1;q<a+10;q++)if(*p>*q){t=*p;*p=*q;*q=t;}例9.9寫出下列程序的結(jié)果:main(){inta[]={1,2,3,4,5},*p;inti;p=a;printf("%d\n",*++p);(1)

printf("%d\n",--*p);(2)

printf("%d\n",*p++);(3)

printf("%d\n",*p+3);(4)printf("%d\n",*p--);(5)

printf("%d\n",*(p+2));(6)

for(i=0;i<5;i++)printf("%d",a[i]);}(7)

2

1163411345數(shù)組名賦值ap12345pp

1ppppp七、指針與字符串:字符串的表示:數(shù)組、指針main(){char*string=“IloveChina”;printf(“%s\n”,string);}/*把字符串首址賦給string,不是把字符串賦給*string*//*用字符數(shù)組名或字符指針變量可以輸出字符串*/string七、指針與字符串:1、利用數(shù)組:charstr[]=“abc”;或charstr[]={“abc”};2、利用指針:char*str=“abc”;或char*str={“abc”};3、利用拷貝函數(shù):strcpy(str,“abc”)(str必須是一維數(shù)組的數(shù)組名)字符串賦值的方法:#include"stdio.h"main(){charstr[]="MS-C";char*p;p=str;while(*p!='\0')putchar(*p++);}MS-C\0strp例9.10下列程序的輸出結(jié)果是MS-C例9.11、下列程序的輸出結(jié)果是#include<stdio.h>main(){char*p1,*p2;p1=p2="ABCDE";while(*p2!='\0')putchar(*p2++);while(--p2>=p1)putchar(*p2);}ABCDEEDCBA例9.12:將字符串a(chǎn)復(fù)制到字符串bmain(){chara[]=“Iamaboy.”,b[20];intj;for(j=0;*(a+j)!=‘\0’;j++)*(b+j)=*(a+j);*(b+j)=‘\0’;for(j=0;b[j]!=‘\0’;j++)printf(“%c”,b[j]);}指針法main(){chara[]=“Iamaboy.”,b[20],*p1=a,*p2=b;intj;for(;*p1!=‘\0’;p1++,p2++)*p2=*p1;*p2=‘\0’;for(j=0;b[j]!=‘\0’;j++)printf(“%c”,b[j]);}下標(biāo)法復(fù)制到字符串b,將字符串結(jié)束標(biāo)記\0復(fù)制給字符串b。(復(fù)制)字符串指針作函數(shù)參數(shù)例9.12:字符串復(fù)制voidcopy_string(from,to)charfrom[],to[];{intj=0;while(from[j]!=‘\0’){to[j]=from[j];j++;}to[j]=‘\0’;}main(){chara[]=“Iamateacher.”;charb[]=“youareastudent.”;copy_string(a,b);printf(“%s”,b);}main(){char*a=“Iamateacher.”;char*b=“youareastudent.”;copy_string(a,b);printf(“%s”,b);}若將主函數(shù)改為字符指針效果一樣上例將形參用字符指針來處理:voidcopy_string(from,to)char*from,*to;{for(;*from!=‘\0’;from++,to++)*to=*from;*to=‘\0’;}voidcopy_string(from,to)char*from,*to;{while((*to=*from)!=‘\0’){to++;from++;}}(字符指針)或:voidcopy_string(from,to)char*from,*to;{while((*to++=*from++)!=‘\0’);}或:注意:對字符指針變量可以賦值,而對字符數(shù)組名不能賦值可以用字符指針變量代表格式字符串.如:char*f;f=“%d,%d”;printf(f,a,b);#include<stdio.h>main(){char*p="%d,a=%d,b=%d\n";inta=111,b=10,c;c=a%b;printf(p,c,a,b);}例9.13、下列程序的輸出結(jié)果是1,a=111,b=10#defineMAX5inta[MAX],i;main(){sub1();sub3(a);sub2();sub3(a);}sub1(){for(i=0;i<MAX;i++)a[i]=i+i;}sub2(){inta[MAX],max,i;max=5;for(i=0;i<max;i++)a[i]=i;}sub3(int*p){inti;for(i=0;i<MAX;i++)printf("%3d",p[i]);printf("\n");}例9.14.寫出下列程序的運(yùn)行結(jié)果0246802468指針變量可以作函數(shù)的參數(shù)例9.15、下列程序的輸出結(jié)果是#include<stdio.h>voidsub(intx,inty,int*sum){*sum=x+y;}main(){intx=9,y=10,s=1;sub(x,y,&s);printf("%d\n",s);}指針變量可以作函數(shù)的參數(shù)19八、指向二維數(shù)組的指針和指針變量例如:a[2][4],對于一個(gè)二維數(shù)組來說:由行與列組成的。并且二維數(shù)組可看作是由2個(gè)數(shù)組長度為4的一維數(shù)組組成。a[0]a[1][0][2][1][3]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]aa+i等價(jià)于&a[i],a[i]等價(jià)于&a[i][0]。a等價(jià)于&a[0]a+i等價(jià)于&a[i]a[0]等價(jià)于&a[0][0]a[i]等價(jià)于&a[i][0]a[0]+j等價(jià)于&a[0][j]a[i]+j等價(jià)于&a[i][j]*(a[0]+j)等價(jià)于a[0][j]*(a[i]+j)等價(jià)于a[i][j]*a等價(jià)于&a[0][0]*(a+i)等價(jià)于&a[i][0]**a等價(jià)于a[0][0]**(a+i)等價(jià)于a[i][0]*a+j等價(jià)于&a[0][j]*(a+i)+j等價(jià)于&a[i][j]*(*a+j)等價(jià)于a[0][j]*(*(a+i)+j)等價(jià)于a[i][j]對于任意的二維數(shù)組存在著下列等價(jià)關(guān)系:main(){inti,j;int*p,a[2][2];p=*a;for(i=0;i<4;i++)scanf("%d",p++);for(i=0;i<2;i++)for(j=0;j<2;j++)printf("%4d",a[i][j]);printf("\n");}例9.16、用指針對二維數(shù)組的輸入:main(){staticinta[3][3]={1,2,3,4,5,6,7,8,9}; inti,*p; p=a[2]; for(i=0;i<3;i++) printf("i=%d==>%d\n",i,*(p+i));}執(zhí)行結(jié)果:i=0==>7i=1==>8i=2==>9例9.17、寫出下列程序的運(yùn)行結(jié)果main(){staticinta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};intj,k,*pa;pa=

;while(pa<a+12){

;pa++;}for(j=0;j<3;j++){for(k=0;k<4;k++)printf("%5d",

);printf("\n");}}例9.18完善程序,使二維數(shù)組中的元素除第一行外,其它值均為零。a[1]*pa=0a[j][k]例9.19輸出二維數(shù)組任一行任一列元素的值(行指針)main(){staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inti,j;scanf("%d%d",&i,&j);printf("a[%d][%d]=%d",i,j,*(*(a+i)+j));}123456789101112a[0]a[1]a[2]aa[i][j]*(*(a+i)+j)pp+1p+2定義一個(gè)指針變量,使得它指向包含4個(gè)元素的一維數(shù)組定義為:int(*P)[4]int(*p)[4];p=a;*(*(p+i)+j))作用:返回值為指針main(){staticfloatscore[][4]={67,78,87,32,78,84,26,68,97,67,74,78};float*search(),*p;intj,m;scanf(“%d”,&m);p=search(score,m);for(j=0;j<4;j++)printf(“%5.2f\t”,*(p+j));}float*search(poin,n)float(*poin)[4];intn;{float*pt;pt=*(poin+n);return(pt);}例9.20用指針函數(shù)輸出m號(hào)學(xué)生4門功課成績定義指針函數(shù)677887327884266897677478定義一個(gè)包含有4個(gè)元素的指針變量poin,來獲得m號(hào)學(xué)生的首地址.poinpoin+1poin+2九、指針數(shù)組和指向指針的指針(二級(jí)指針)定義:類型標(biāo)識(shí)*數(shù)組名[數(shù)組長度說明]指針數(shù)組的特點(diǎn):其元素為指針類型數(shù)據(jù)main(){char*str[]={“WORD","MATH",“THE",“I"};char**q;intnum;q=str;for(num=0;num<4;num++)printf("%s\n",*(q++));}WORD\0MATH\0THE\0I\0str[0]str[1]str[2]str[3]q指向指針的指針main(){voidsort();staticchar*name[]={串表};intn=5;sort(name,n);print(name,n);}例9.21:將若干個(gè)字符串按字母順序輸出voidsort(name,n)char*name[];intn;{char*temp;intj,k,i;for(j=0;j<n-1;j++){i=j;for(k=j+1;k<n;k++)if(strcmp(name[i],name[k])>0)i=k;if(i!=j){temp=name[j];name[j]=name[i];name[i]=temp;}}}voidprint(name,n)char*name[];intn;{intj;for(j=0;j<n;j++)printf(“%s\n”,name[j]);}/*name[j]為j個(gè)字符串首址*/main(){voidaverage();voidsearch();staticintscore[3][4]={…...};average(*score,12);search(score,2);/*求第二個(gè)學(xué)生的成績*/}voidaverage(p,n)float*p;intn;{float*p_end,aver,sum=0;p_end=p+n-1;for(;p<=p_end;p++)sum+=(*p);aver=sum/n;printf(“%5.2f”,aver);}多維數(shù)組的指針作函數(shù)參數(shù)例9.22:計(jì)算3個(gè)學(xué)生4門功課的總平均分voidsearch(p,n)float(*p)[4];intn;{intj;for(j=0;j<4;j++)printf(“5.2f”,*(*(p+n)+j);}十、指向函數(shù)的指針變量(選講)目的:通過函數(shù)指針來調(diào)用函數(shù)一般形式:類型標(biāo)識(shí)符號(hào)(*指針變量名)();或:類型標(biāo)識(shí)符號(hào)(*指針變量名)(參數(shù)表);例:若有函數(shù)max(a,b),并且使指針p指向函數(shù)的入口地址,其定義方法為:{intmax();int(*p)();p=max;

c=(*p)(a,b);

利用函數(shù)指針調(diào)用函數(shù)max(a,b)main()}注意:不能用*(p+1)表示函數(shù)入口的下一條指令。例9.23:用指向函數(shù)的指針求兩個(gè)數(shù)的大者main(){intmax(),a,b,c;int(*p)();/*指向函數(shù)的指針變量*/p=max;/*將函數(shù)max的指針賦給p*/scanf(“%d,%d”,&a,&b);c=(*p)(a,b);/*通過指針變量調(diào)用函數(shù)*/printf(“max=%d”,c);}max(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}c=max(a,b);c=(*p)(a,b);方法:利用指向函數(shù)的指針變量作函數(shù)參數(shù)main(){intmax(),min(),add(),a,b;scanf(“%d,%d”,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);}max(intx,inty){intz;If(x>y)z=x;elsez=y;return(z);}min(intx,inty){intz;if(x<y)z=x;elsez=y;return(z);}add(intx,inty){intz;z=x+y;return(z);}process(x,y,fun)intx,y,(*fun)();{intresult;result=(*fun)(x,y);printf(“%d\n:,result);}例9.24:輸入兩個(gè)數(shù),分別求大者、小者、和例9.25、完善程序。求n!long(*p)()p=fact#include<stdio.h>longfact();main(){intn;

;printf("Enterintegern=\n:");scanf("%d",&n);;printf("TheresultFac=%ld",(*p)(n));}longfact(intn){if(n<=1||n==0)

;else

;}return1return(n*fact(n-1))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論