c語言指針課件_第1頁
c語言指針課件_第2頁
c語言指針課件_第3頁
c語言指針課件_第4頁
c語言指針課件_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第9章指針1精選ppt特點(diǎn)能直接對內(nèi)存地址操作,使用靈活實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)管理可以使程序簡潔、緊湊、高效用間接訪問的方式改變數(shù)據(jù)的邏輯順序調(diào)用函數(shù)時(shí)可實(shí)現(xiàn)變量的引用傳遞2精選ppt地址和指針的概念變量的地址和變量的值inti=3;floatj=6;doublek=9;36.09.0變量i變量j變量k2200220622022214程序中定義的變量,系統(tǒng)根據(jù)它的類型給它分配一定長度的內(nèi)存單元,該內(nèi)存單元的起始地址即為變量的地址。該內(nèi)存單元的內(nèi)容就是變量的值。3精選ppt直接訪問和間接訪問直接訪問:用變量名直接從它對應(yīng)的地址存取內(nèi)容。如:intx=5,y=8,z=0;z=x+y;

580變量x變量y變量z22002202220413直接從x和y對應(yīng)的地址2200和2202取出內(nèi)容5和8然后相加將結(jié)果13存入變量z對應(yīng)的地址2204的單元中。4精選ppt間接訪問定義一個(gè)存放地址的變量p

(p的地址1500),將x的地址2200存放在變量p中。通過變量p取出地址2200,再按此地址存取其中的內(nèi)容,就間接的完成了對x的存取。當(dāng)p的內(nèi)容改為2202時(shí),通過變量p取出地址2202,再按此地址,存取的就是變量y的內(nèi)容。p就是指針變量580變量x變量y變量z22002202220422001500變量p22025精選ppt指針變量的定義一般形式:基類型名*指針變量名說明:基類型名:指針變量所指向的變量的類型名稱指針變量名:所定義的指針變量的名稱*:表示它后面的變量名是指針類型功能:(1)定義該指針變量名為指向基類型的指針變量,為該變量分配存儲(chǔ)單元,其長度等于存儲(chǔ)地址的字節(jié)數(shù)。(2)基類型確定用指針變量“間接”存取數(shù)據(jù)的存儲(chǔ)單元個(gè)數(shù)和存儲(chǔ)形式。該變量只能指向基類型數(shù)據(jù)。6精選ppt指針變量的初始化用=&變量名來給指針變量賦初值。選項(xiàng)中的變量名必須是已定義過的,其類型必須與基類型一致。表示將它對應(yīng)的地址值賦給所定義的指針變量。例如:intx,p=&x;intx,*p=&x;intx;float*p=&x;可以用賦值語句給指針變量賦值:floaty,*py;py=&y;7精選ppt指針變量的引用引用指針變量的指針值與引用其它類型的變量一樣直接用它的變量名引用指針變量所指向的變量時(shí),用“*指針變量名”注意:①指針變量的值與它所指向變量的值之間的差別②指針變量只有正確賦值后才能通過它訪問指向的變量。xintx;pp=&x;&xint*p;*p*p=5;58精選ppt指針變量的運(yùn)算1.&:取地址運(yùn)算符,取右邊變量的地址2.*:指向運(yùn)算符(間接訪問運(yùn)算符),

訪問指針變量右邊所指向的變量。&a是變量a的地址*p是指針變量p指向的變量。說明:“&”和“*”都是單目運(yùn)算符,它們的優(yōu)先級(jí)相同,按自右而左方向結(jié)合。9精選ppt如果已定義

floata,*p=&a;則*p是變量a&*p是變量a的地址p&*p等價(jià)于p而&a是變量a的地址p*&a是p所指向的變量a*&a等價(jià)于a10精選ppt注意(1).指針變量定義和引用指向變量的“*”含義有差別。(2).不能引用沒有賦值的指針變量,不要誤認(rèn)為p定義后變量*p就已存在,必須給p正確賦值后,變量*p才存在。(3).p=&a;是給指針變量p賦值,*p=3;是給p指向的變量賦值。兩者含義完全不同。(4).給指針變量賦值必須用同類型的指針。(5).指針變量只存放地址,地址值是無符號(hào)整數(shù),但不能直接用整型量(或其它非地址量)賦值給指針變量。int*p1=2200;11精選ppt給變量賦值的兩種方法1.直接訪問用變量名如:

inti;i=5;2.間接訪問通過指向變量i的地址的指針變量p賦值如:inti,*p;p=&i;*p=5;12精選ppt取地址運(yùn)算符&和指向運(yùn)算符*的應(yīng)用main(){intm,n;int*p=&m,*q=&n;printf("Inputm,n:");scanf("%d%d",p,&n);printf("m=%d&m=%X\n",m,&m);printf("*p=%dp=%X\n",*p,p);printf("n=%d&n=%X\n",n,&n);printf("*q=%dq=%X\n",*q,q);}運(yùn)行結(jié)果:Inputm,n:123456

m=123&m=FFD6*p=123p=FFD6n=456&n=FFD8*q=456q=FFD813精選ppt{intx,y;xyp1pp2

int*p,*p1,*p2;

p1=&x;p2=&y;&x&y86

x=8;y=6;

printf("min=%d,max=%d\n",*p1,*p2);}

p1=p2;&y

if(x>y){p=p1;&x

p2=p;}&xmain()運(yùn)行結(jié)果:

min=6,max=8例:通過交換指針變量值按大小順序輸出14精選ppt指針變量作為函數(shù)的參數(shù)以指針類型為函數(shù)的參數(shù),作用是將變量的地址傳入函數(shù)。15精選pptintx,y;int*pt1;*pt2;x=8;y=6;pt1=&x;pt2=&y;if(x>y)swap(pt1,pt2);printf("x=%d,y=%d\n",x,y);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;{intp;p8pt1pt2xy

{

}

main(){

}&x&yp1p2&x&y8668運(yùn)行結(jié)果:

x=6,y=8intx,y;int*pt1;*pt2;x=8;y=6;pt1=&x;pt2=&y;if(x>y)swap(pt1,pt2);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;{intp;printf("x=%d,y=%d\n",x,y);16精選ppt指針與數(shù)組C語言中規(guī)定數(shù)組名是指針類型的符號(hào)常量,該符號(hào)常量值等于數(shù)組首元素的地址(簡稱數(shù)組首地址),它的類型是指向數(shù)組元素的指針類型。即數(shù)組名是指向該數(shù)組首元素的指針常量。17精選ppt指向數(shù)組元素的指針1.定義指向數(shù)組元素的指針變量定義指向數(shù)組元素的指針變量與定義指向變量的指針變量的方法相同.如:inta[10];int*p;p=&a[0];由于數(shù)組名是指向0號(hào)元素的指針類型符號(hào)常量,所以a與&a[0]相等。p=&a[0];p=a;兩句等價(jià)p=a不是把a(bǔ)的各元素賦給p注意數(shù)組名與指針變量的區(qū)別18精選ppt指針運(yùn)算指針變量可以加減一個(gè)整數(shù),兩個(gè)同類型指針可以相減得到一個(gè)整數(shù)。指針變量每增減1,地址值增減量等于所指向的變量類型的字節(jié)數(shù)sizeof(type),將它稱作地址步進(jìn)單位d。當(dāng)指針變量指向數(shù)組元素時(shí),指針變量每加減1,表示指針前后移動(dòng)1個(gè)元素,地址值增減d。如:

inta[10],*p;p=a;p++;p+=3;

19精選ppt注意:

指針變量的運(yùn)算順序。++*p,*p++,*(++p),(*p)++四者之間的差別:++*p先給p指向的變量加1,然后取其值(*p)++先取p指向的變量值,然后該變量值加1*p++取p所指向變量的值,然后p增1*++pP先增1,然后取p所指向變量的值20精選pptmain(){inta[4]={1,2,3,4},b,c,d,e;int*p=a;b=*p++;printf(“\n%d,%d,”,b,*p);c=*++p;d=++*p;printf(“%d,%d”,c,d);}運(yùn)行結(jié)果1,2,3,421精選ppt通過指針引用數(shù)組元素在inta[10],*p=a;定義的情況下:(1)p+i或a+i就是a[i]的地址。都要進(jìn)行a+i×d的運(yùn)算。(2)*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素a[i]。

數(shù)組元素中的“[]”是變址運(yùn)算符,相當(dāng)于*(+),

a[i]相當(dāng)于*(a+i)。(3)指向數(shù)組元素的指針變量也可帶下標(biāo),如

p[i]與*(p+i)等價(jià)。所以,a[i],*(a+i),p[i],*(p+i)

四種表示法全部等價(jià)。(4)注意p與a的差別,p是變量a是符號(hào)常量,不能給a賦值,語句a=p;a++;

都是錯(cuò)的。22精選pptp&a[0]a[9]a[1]a[2]a[i]a[0]p+1,a+1p+2,a+2

p+i,a+ip+9,a+9a引用數(shù)組元素可用:1)下標(biāo)法,如a[i],p[i]。2)指針法,如*(p+i)或*(a+i),其中p是指向數(shù)組a的元素的指針變量。23精選pptmain(){inta[10];int*p,i;for(p=a;p<(a+10);p++)scanf("%d",p);printf("\n");

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

for(i=0;i<10;i++)printf("%d",*(a+i));②

p=a;/*不能省略*/

for(i=0;i<10;i++,p++)printf("%d",*p);③

for(p=a;p<(a+10);p++)printf("%d",*p);

例.輸入/輸出數(shù)組全部元素24精選ppt用字符型指針訪問字符數(shù)組和字符串【例9.5】用字符型數(shù)組名和字符指針變量

兩種方法整體輸入/輸出字符串。main(){chars[81]="Hello!",*p=s;char*ps="Welcometoyou!";

printf("%s\n",s);

printf("%s\n",ps);

gets(s);

printf("%s\n",s);gets(p);

printf("%s\n",s);}25精選ppt字符指針變量和字符數(shù)組的區(qū)別(1)存儲(chǔ)的內(nèi)容不同:字符數(shù)組存儲(chǔ)著字符串的內(nèi)容,而字符指針變量存放的是字符串首元素的地址,不是它的內(nèi)容。(2)分配的內(nèi)存單元不同:字符數(shù)組分配一段有確定地址的內(nèi)存。而指針變量只分配存放地址的內(nèi)存單元,該指針變量可以指向一個(gè)字符型數(shù)據(jù),但若未賦初值,則它并未指向一個(gè)明確的地址。此時(shí)它指向的變量并不存在。26精選ppt(3)賦值方法不同:對字符數(shù)組只能在定義時(shí)整體賦初值,不能用賦值語句整體賦值。賦值語句只能對各個(gè)元素分開賦值。如:chars[16];s="Iamastudent.";chars[16]="Iamastudent.";對字符指針變量,可以采用下面方法賦值:

char*p;p="Iamastudent.";(4)指針變量的值是可以改變的,字符數(shù)組名是地址常量其值是不能改變的。27精選ppt數(shù)組或指針變量作函數(shù)參數(shù)如:main(

)f(inta[],intn){intarray[10];{......f(array,10)}...}28精選ppt由于數(shù)組名代表首地址,能接收并存放地址值的只能是指針變量。故編譯系統(tǒng)將形參數(shù)組名作為指針變量來處理。例中函數(shù)首部f(inta[],intn)可寫成f(int*a,intn)兩種完全等價(jià)。29精選ppt歸納起來,如果有一個(gè)數(shù)組,想在被調(diào)用的函數(shù)中改變其元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下四種:(1).實(shí)參和形參都用數(shù)組名。(2).實(shí)參用數(shù)組名,形參用指針變量。(3).實(shí)參用指針變量,形參用數(shù)組名。(4).實(shí)參和形參都用指針變量。實(shí)質(zhì)都是地址值的傳遞30精選ppt【例9.7】通過調(diào)用函數(shù),將整型數(shù)組的所有元素加10。參數(shù)傳遞用四種方法實(shí)現(xiàn)。voidadd(intb[],intn){inti;for(i=0;i<n;i++)b[i]+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};add(a,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(int*p,intn){int*pend=p+n;for(;p<pend;p++)*p+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};add(a,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(intb[],intn){inti;for(i=0;i<n;i++)b[i]+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};int*q=a;add(q,10);for(i=0;i<10;i++)printf("%4d",a[i]);}voidadd(int*p,intn){int*pend=p+n;for(;p<pend;p++)*p+=10;}main(){inti,a[10]={1,2,3,4,5,6,7,8,9,10};int*q=a;add(q,10);for(i=0;i<10;i++)printf("%4d",a[i]);}31精選ppt用字符數(shù)組或指針做函數(shù)參數(shù)傳遞字符串將字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以用地址傳遞的方法,即用字符數(shù)組名或用字符指針變量作參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串中的內(nèi)容,在主調(diào)函數(shù)中可以得到改變了的字符串。32精選ppt【例9.8】字符串復(fù)制函數(shù)主要功能的實(shí)現(xiàn)。(1)用字符數(shù)組作參數(shù)voidstrcpy(chars1[],chars2[]){inti=0;while(s2[i]!='\0'){s1[i]=s2[i];i++;}s2[i]='\0';}main(){chara[20]="Iamateacher.";charb[]="youareasrudent.";printf("stringa=%s\nstringb=%s\n",a,b);strcpy(a,b);printf("\nstringa=%s\nstringb=%s\n",a,b);}33精選ppt(2)形參用字符指針變量。程序如下:voidstrcpy(char*s1,char*s2){for(;*s2!='\0';s2++,s1++)*s1=*s2;*s1='\0';}main(){chara[20]="Iamateacher.";char*b="youareasrudent.";printf("stringa=%s\nstringb=%s\n",a,b);strcpy(a,b);printf("\nstringa=%s\nstringb=%s\n",a,b);}{while((*s1=*s2)!='\0'){s1++;s2++;}*s1='\0';}{while(*s2!='\0')*s1++=*s2++;*s1='\0';}{while(*s2)*s1++=*s2++;*s1='\0';}{

while((*s1++=*s2++)!='\0')}{

while(*s1++=*s2++)}34精選ppt多維數(shù)組和指向分?jǐn)?shù)組的指針多維數(shù)組的地址以二維數(shù)組為例,設(shè)二維數(shù)組a有3行4列。

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}a是數(shù)組名,a數(shù)組有3行,即3個(gè)分?jǐn)?shù)組:a[0],a[1],a[2]。

每個(gè)分?jǐn)?shù)組又是含4個(gè)列元素的一維數(shù)組。35精選ppta[2][2]a[1][2]a[0][2]a[2][3]a[2][1]a[2][0]a[1][3]a[1][1]a[1][0]a[0][3]a[0][1]a[0][0]a[0]a[1]a[2]2000a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a2000Ha+12008a+22010a[0]+1*(a+0)+1a[1]+1*(a+1)+1a[2]+1*(a+2)+1200A20122002基類型行指針與列指針a[2][3]*(a[2]+3)*(*(a+2)+3)

+3

+2

+1

+0a[0]a[0]a[0]a[0]*(a+0)*(a+0)*(a+0)*(a+0)

+3

+2

+1

+0a[1]a[1]a[1]a[1]*(a+1)*(a+1)*(a+1)*(a+1)36精選ppt注意

a+1與a[0]+1不同a+1是a第1行分?jǐn)?shù)組地址*(a+1)是第1行數(shù)組名**(a+1)是元素a[1][0]

a[0]是第0行分?jǐn)?shù)組名a[0]+1是元素a[0][1]

地址*(a[0]+1)是元素a[0][1]37精選ppt形式含義內(nèi)容a,&a[0] 二維數(shù)組名,0行分?jǐn)?shù)組地址1000a[0],*(a+0),*a,&a[0][0]0行一維數(shù)組名,0行0列元素地址

1000a[0]+1,*a+1,&a[0][1]0行1列元素地址1002a+1,&a[1]

1行一維數(shù)組首地址

1008a[1],*(a+1),&a[1][0]

1行一維數(shù)組名,1行0列元素地址

1008a[1]+3,*(a+1)+3,&a[1][3]

1行3列元素地址1014*(a[2]+3),*(*(a+2)+3),a[2][3]

2行3列元素12注意:

a和a[0]的地址均為1000但不等價(jià),a+1和a[0]+1不等。38精選ppt指向多維數(shù)組的指針1.指向多維數(shù)組元素的指針例:用指針變量輸出數(shù)組元素的值。main()

{inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*p;

for(p=a[0];p<a[0]+15;p++)

{if((p-a[0])%5==0)printf("\n");

printf("%4d",*p);

}

}39精選ppt定義形式:

數(shù)據(jù)類型

(*指針名)[一維數(shù)組維數(shù)];一維數(shù)組指針變量維數(shù)和二維數(shù)組列數(shù)必須相同。例:inta[3][4],(*p)[4]=a;2.指向分?jǐn)?shù)組的指針40精選ppta[2][2]a[1][2]a[0][2]a[2][3]a[2][1]a[2][0]a[1][3]a[1][1]a[1][0]a[0][3]a[0][1]a[0][0]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a2000a+12008a+22010p[0]+1p或*p+1p[1]+2p+1或*(p+1)+2p+2inta[3][4];int(*p)[4]=a;41精選ppt例:用指向二維數(shù)組的分?jǐn)?shù)組的指針變量,按行輸出。main()

{inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int*q,(*p)[4];

for(p=a;p<a+3;p++)

{for(q=*p;q<*p+4;q++)

printf("%5d",*q);

printf("\n");

}

}注意:

int(*p)[5];表示p是一個(gè)指針變量,可以指向含有5個(gè)元素的一維數(shù)組,其中每個(gè)元素都是整型的。如果定義為int*p[5];由于“[]”優(yōu)先級(jí)高,則表示p首先是數(shù)組,它有5個(gè)元素,每個(gè)元素為指向整型變量的指針。

123456789

101112qq+2pp+242精選ppt用多維數(shù)組名和指針變量作函數(shù)參數(shù)(1)用多維數(shù)組名作實(shí)參或形參。如:f(inta[][4],intn);(2)用指向元素的指針變量作實(shí)參或形參。如:f1(int*p);(3)用指向分?jǐn)?shù)組的指針變量作函數(shù)參數(shù)。如:f2(int(*q)[4],intm);43精選ppt【例9.16】用兩個(gè)二維數(shù)組存儲(chǔ)矩陣,調(diào)用函數(shù)求兩個(gè)矩陣之差,差矩陣存放在第一個(gè)實(shí)參數(shù)組中,用指向分?jǐn)?shù)組的指針變量作形參。矩陣輸出也用函數(shù)實(shí)現(xiàn)。#defineN4sub(int(*p1)[N],int(*p2)[N],intm){int*q1,*q2,(*u)[N];u=p1+m;for(;p1<u;p1++,p2++)for(q1=*p1,q2=*p2;q1<*p1+N;q1++,q2++)*q1-=*q2;}print(int(*p)[N],intm){int*q,(*u)[N];u=p+m;for(;p<u;p++){for(q=*p;q<*p+N;q++)printf("%6d",*q);printf("\n");}printf("\n");}main(){inti,j,a[][N]={{1,2,3,4},{5,6,7,8}};intb[][N]={{10,20,30,40},{50,60,70,80}};print(a,2);print(b,2);sub(b,a,2);print(b,2);}44精選ppt指針數(shù)組如果每個(gè)數(shù)組元素均為指針類型的變量,即數(shù)組元素的類型是指針類型,則稱這樣的數(shù)組為指針數(shù)組。一維指針數(shù)組的定義形式為:基類型名*數(shù)組名[數(shù)組長度]〖={地址初值列表}〗

例如:inti,j,k,m,n;int*q[5]={&i,&j,&k,&m,&n};45精選pptmain(){chara[]="Program";charb[]="Fortran";charc[]="Basic";

char*p[4];

p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;}p[0]p[1]p[2]p[3]char*p[4]Basic\0Program\0Fortran\00或:main(){char*p[4];p[0]="Program";p[1]="Fortran";p[2]="Basic";p[3]=NULL;}初始化:main(){char*p[]={"Program","Fortran","Basic",NULL};}46精選ppt用指針數(shù)組處理多個(gè)字符串例:將5個(gè)字符串遞增排序后輸出。#include<stdio.h>#include<string.h>main(){char*pccolor[]={"red","blue","yellow","green","purple"};intn=5;printf("Beforesortingis:\n");

OutPut(pcolor,n);

Sort(pcolor,n);printf("Aftersortingis:\n");

OutPut(pcolor,n);}47精選pptvoidSort(char*a[],intn){ inti,j,k;

char*t;

for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { k=j; } if(k!=i) { t=a[i];

a[i]=a[k]; a[k]=t; } }}if(strcmp(a[k],a[j])>0)48精選pptvoidOutPut(char*a[],intn){ inti; for(i=0;i<n;i++) printf("%s\n",a[i]);}49精選ppt\0der\0neerg\0eulb\0wolley\0elpruppcolor[4]pcolor[3]pcolor[2]pcolor[1]pcolor[0]\0der\0neerg\0eulb\0wolley\0elpruppcolor[4]pcolor[3]pcolor[2]pcolor[1]pcolor[0]排序前排序后50精選ppt指向指針的指針(二級(jí)指針)指針變量中存放一級(jí)指針變量的地址例int**p1;

int*p2;inti=3;

p2=&i;p1=&p2;**p1=5;p1P2(指針變量)i(整型變量)二級(jí)指針一級(jí)指針目標(biāo)變量二級(jí)間接尋址&p2&i5351精選ppt用指向指針的指針訪問指針數(shù)組通過指針變量來訪問指針數(shù)組的元素,就必須定義指向指針的指針變量。用所定義的指向指針的指針變量來指向指針數(shù)組的各元素,進(jìn)行間接訪問。若要通過該指針變量來訪問指針數(shù)組元素所指向的變量的內(nèi)容,則需要進(jìn)行兩次間接訪問。52精選ppt【例9.10】指針數(shù)組的各元素指向整型數(shù)據(jù)的簡單實(shí)例main(){staticints[5]={10,20,30,40,50};int*q[5]={&s[0],&s[1],&s[2],&s[3],&s[4]};int**p;for(p=q;p<q+5;p++)printf("%d\t",**p);}53精選ppt指針數(shù)組作main()函數(shù)的形參C語言規(guī)定,main()函數(shù)形參是固定的,第一個(gè)形參為整型,它接收實(shí)參的個(gè)數(shù),第二個(gè)形參為字符指針數(shù)組,它的各元素分別接收命令行輸入的各字符串的首地址。例如:main(intargc,char*argv[])形參argc接收實(shí)參的個(gè)數(shù),字符指針數(shù)組argv接收各字符串的首地址。它的一般形式為:命令名參數(shù)1參數(shù)2…參數(shù)n-154精選ppt【例9.11】編寫源程序show.c,在命令行輸入show和若干個(gè)字符串后,順序分行顯示這些字符串。show.c的程序如下:main(intargc,char*argv[]){inti;for(i=1;i<argc;i++)

printf("%s\n",argv[i]);}改寫為:main(intargc,char**argv){while(--argc>0)printf("%s\n",*++argv);}55精選ppt【例9.12】

編寫程序echo.c,實(shí)現(xiàn)操作系統(tǒng)中的echo命令,echo命令是將后面所帶的參數(shù)原樣顯示出來。它與上例相似但不分行,所帶的參數(shù)都顯示在同一行。

main(intargc,char**argv){while(--argc>0)printf("%s%c",*++argv,(argc>1)?'':'\n');}在操作系統(tǒng)命令行狀態(tài)下輸入:

echoWelcometoyou!

執(zhí)行后輸出以下信息:

Welcometoyou!56精選ppt【例9.18】實(shí)現(xiàn)系統(tǒng)提供的字符串復(fù)制函數(shù)strcpy()的全部功能。char*strcpy(char*s1,char*s2){char*p=s1;

while(*s1++=*s2++);

return(p); }main(){chars[20];printf("%s\n",strcpy(s,"Welcometoyou!"));}57精選ppt結(jié)構(gòu)體與指針指向結(jié)構(gòu)體變量的指針結(jié)構(gòu)體指針變量的定義:struct結(jié)構(gòu)體名

*指針變量名;例如:structstudent*pt=&stu;structstudent{intnum;charname[20];charsex;intage;}stu;58精選ppt使用結(jié)構(gòu)體指針變量引用成員形式(*結(jié)構(gòu)體指針名).成員名結(jié)構(gòu)體指針名->成員名結(jié)構(gòu)體變量名.成員名structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*p).nump->numstu.numagesexnamenumstupp=&stu.num59精選ppt例:結(jié)構(gòu)體指針的使用#include<stdio.h>#include<string.h>structstudent{intnum;charname[20];charsex;intage;};main(){structstudentstu,*p;p=&stu;stu.num=10011;strcpy(,"KobeBryant");

p->sex='M';p->age=33;

printf("\nNo:%d\nname:%s\nsex:%c\nscore:%d\n",

(*p).num,p->name,stu.sex,p->age);}60精選ppt例:結(jié)構(gòu)體數(shù)組指針的使用structstudent{intnum;charname[20];charsex;intage;}stu[3]=

{{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10103,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%-6d%s\t%-3c%d\n",

p->num,p->name,p->sex,p->age);}10101LiLinM18stu[0]pstu[1]stu[2]p+1p+210102ZhangFunM1910103WangMinF2061精選ppt結(jié)構(gòu)體指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量的成員作參數(shù)---單值傳遞用結(jié)構(gòu)體變量作參數(shù)---多值傳遞用指向結(jié)構(gòu)體變量或數(shù)組的指針作參數(shù)---地址傳遞。62精選ppt【例9.17】采用“引用傳遞”的方式,用指向結(jié)構(gòu)體的指針變量作參數(shù),在input函數(shù)中輸入并計(jì)算平均成績,在main函數(shù)輸出。#defineN4#include<string.h>#defineFMT"%5d%-11s%5d%8d%8d%10.1f\n"structst{intnum;charname[11];ints[3];floataver;};voidinput(structst*p){scanf("%d%s%d%d%d",&p->num,p->name,&p->s[0],&p->s[1],&p->s[2]);p->aver=(p->s[0]+p->s[1]+p->s[2])/3.0;}main(){structsta[N],*p=a;printf("Inputstudent:numbernamescore1score2score3\n");while(p<a+N)input(p++);

printf("numbernamescore1score2score3average\n");for(p=a;p<a+N;p++)printf(FMT,p->num,p->name,p->s[0],p->s[1],p->s[2],p->aver);}63精選ppt指針與鏈表鏈表可以動(dòng)態(tài)的進(jìn)行存儲(chǔ)分配1249head1249A13561356B14751475C10211021DNULLhead:

頭指針,存放一個(gè)地址,指向鏈表中的第一個(gè)元素.每一個(gè)元素稱為一個(gè)“結(jié)點(diǎn)”,每個(gè)結(jié)點(diǎn)都包括兩部分:1.用戶需要的實(shí)際數(shù)據(jù);2.下一個(gè)結(jié)點(diǎn)的地址.表尾:它的地址部分放一個(gè)“NULL”,鏈表到此結(jié)束.64精選ppt可用結(jié)構(gòu)體類型的變量來存儲(chǔ)鏈表中的結(jié)點(diǎn)元素.1249head1249A13561356B14751475C10211021DNULL每一個(gè)結(jié)點(diǎn)中存放地址的部分可用指針來實(shí)現(xiàn).例:structstudent{intnum;floatscore;

structstudent*next;};65精選ppt簡單靜態(tài)鏈表#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,*head,*p;a.num=9901;a.score=89.5;b.num=9903;b.score=90;c.num=9905;c.score=85;

head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{printf(“%ld%5.2f\n”,p->num,p->score);

p=p->next;}while(p!=NULL);}anumscorenextbcheadp990189.5990390990585&a&b&cNULL&a&b&cNULL66精選ppt動(dòng)態(tài)鏈表處理動(dòng)態(tài)鏈表所需的函數(shù)1.malloc函數(shù)void*malloc(unsignedintsize);作用是:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)分配一個(gè)長度為size的連續(xù)空間原型說明在“stdlib.h”頭文件和“alloc.h”頭文件中67精選ppt2.calloc函數(shù)

void*calloc(unsignedn,unsignedsize);作用是:在內(nèi)存的動(dòng)態(tài)區(qū)分配n個(gè)長度為size的連續(xù)空間.3.free函數(shù)voidfree(void*p);作用是:釋放由p指向的內(nèi)存區(qū).68精選ppttypedefstructNode{intdata;

structNode*next;}Node;鏈表的插入操作se∧×①s->next=pre->next;②pre->next=s;順序可以顛倒嗎?a1a2ai-1aian∧……preh

voidInsList(Node*L,inti,inte){ Node*pre,*s;intk=0;pre=L;while(pre!=NULL&&k<i-1){pre=pre->next;k=k+1;}if(k!=i-1){printf(“插入位置不合理!”);

return;}s=(Node*)malloc(sizeof(Node));s->data=e;

s->next=pre->next;pre->next=s;}69精選ppt鏈表的刪除操作××pre->next=pre->next->next;a1a2ai-1aian∧……preai+1rL

free(r);

voidDelList(Node*L,inti){Node*pre,*r;pre=L;intk=0;while(pre->next!=NULL&&k<i-1){pre=pre->next;k=k+1;}if(k!=i-1){printf(“刪除結(jié)點(diǎn)的位置i不合理!”);returnERROR;}

r=pre->next;pre->next=pre->next->next;free(r);returnOK;}70精選ppt建立動(dòng)態(tài)鏈表頭插法建表尾插法建表頭插法建表sA∧s指向新申請的結(jié)點(diǎn)s->data=A;H∧sA∧插入第一個(gè)結(jié)點(diǎn):插入某一個(gè)結(jié)點(diǎn):H∧A∧sB∧從一個(gè)空表開始,重復(fù)讀入數(shù)據(jù),生成新結(jié)點(diǎn),將讀入數(shù)據(jù)存放到新結(jié)點(diǎn)的數(shù)據(jù)域中,然后將新結(jié)點(diǎn)插入到當(dāng)前鏈表的表頭結(jié)點(diǎn)之后,直至讀入結(jié)束標(biāo)志為止?!立賡->next=H->next;②H->next=s;順序可以顛倒嗎?H∧初始化空表71精選ppt

LinklistCreateFromHead(){Node*s,*L;charc;intflag=1;L=(Node*)malloc(sizeof(Node));

L->next=NULL;while(flag){c

溫馨提示

  • 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)論