C語(yǔ)言程序設(shè)計(jì)(第三版)課件:指針的應(yīng)用_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第三版)課件:指針的應(yīng)用_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第三版)課件:指針的應(yīng)用_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第三版)課件:指針的應(yīng)用_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第三版)課件:指針的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

指針的應(yīng)用本章主要內(nèi)容1、指針與數(shù)組2、字符串的指針和指向字符串的指針變量3、指針數(shù)組4、指向指針的指針5、函數(shù)指針6、返回指針的函數(shù)7、main()函數(shù)的返回指和參數(shù)9.1一維數(shù)組與指針C語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的起始地址,一個(gè)數(shù)組包含若干個(gè)元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)空間,都有相應(yīng)的地址,指針變量可以指向數(shù)組或數(shù)組元素。【例9.1】下面的程序用于演示數(shù)組元素的引用方法,請(qǐng)認(rèn)真體會(huì)它們的聯(lián)系和區(qū)別。#include"stdio.h"intmain(){inta[5],i;for(i=0;i<5;i++){scanf("%d",&a[i]);}for(i=0;i<5;i++){printf("%3d",a[i]);}printf("\n");return0;}#include"stdio.h"intmain(){inta[5],i;for(i=0;i<5;i++){scanf("%d",a+i);}for(i=0;i<5;i++){printf("%3d",*(a+i));}printf("\n");return0;}9.1.1數(shù)組名的特殊意義及其在訪問(wèn)數(shù)組元素中的作用9.1.2數(shù)組元素的指針inta[5],*p;p=&a[0];p=&a[0];等價(jià)于p=a;其作用是將指針變量p指向數(shù)組元素的首地址,其指向關(guān)系如圖9-2(b)所示。9.1.3指針變量運(yùn)算指針變量的運(yùn)算是指指針變量所持有的地址為運(yùn)算對(duì)象進(jìn)行的運(yùn)算,所以指針變量的運(yùn)算實(shí)際上就是地址的運(yùn)算。

指針的運(yùn)算常常是針對(duì)數(shù)組元素的,因?yàn)閿?shù)組在內(nèi)存中是連續(xù)存放的,所以指向同一數(shù)組中不同元素的兩個(gè)指針的關(guān)系運(yùn)算常用于比較它們所指元素在數(shù)組的前后位置關(guān)系。指針的算術(shù)運(yùn)算(增1或減1)則常用來(lái)移動(dòng)指針的指向,使其指向數(shù)組中的其他元素。這里強(qiáng)調(diào)只有運(yùn)算結(jié)果仍指向同一數(shù)組中的元素時(shí),指針運(yùn)算才有意義。1、指針加上整數(shù)

指針p加上整數(shù)j將產(chǎn)生指向特定元素的指針,這個(gè)特定元素是p原來(lái)指向的元素后的第j個(gè)位置。

2、指針減去整數(shù)指針p減去整數(shù)j將產(chǎn)生指向特定元素的指針,這個(gè)特定元素是p原來(lái)指向的元素前的第j個(gè)位置。

3、兩個(gè)指針相減當(dāng)兩個(gè)指針相減的時(shí)候,結(jié)果為兩個(gè)指針之間的距離,用數(shù)組元素的個(gè)數(shù)來(lái)表示。因此,如果p指向a[i]且q指向a[j],則p-q就等于i-j。4、指針的比較

可以用關(guān)系運(yùn)算符(<、<=、>、>=)和判斷運(yùn)算符(==和!=)進(jìn)行指針的比較運(yùn)算,只有在兩個(gè)指針指向同一數(shù)組時(shí),用關(guān)系運(yùn)算符進(jìn)行的指針比較才有意義。比較的結(jié)果依賴于數(shù)組中兩個(gè)元素的相對(duì)位置。例如:inta[10],*p,*q;p=&a[5];q=a[1];p<=q的指位0,而p>=q的結(jié)果為1。inta[5],*p;p=a;

表明定義了一個(gè)指向整形數(shù)據(jù)的指針變量p,使其指向了數(shù)組a的首地址,通過(guò)這個(gè)指針變量p就可以訪問(wèn)數(shù)組a的元素。

5、用指針變量訪問(wèn)數(shù)組元素注意:指針運(yùn)算p+1和p++表面現(xiàn)象上看,都是對(duì)當(dāng)前的指針p進(jìn)行加1運(yùn)算,但p+1并不改變當(dāng)前指針的指向,p++表示使p的指向從當(dāng)前的位置指向下一個(gè)元素。p++的偏移問(wèn)題,是偏移1*sizeof(基類型)個(gè)字節(jié)。采用通過(guò)移動(dòng)指針變量p來(lái)引用數(shù)組元素的方法,可將【例9.1】程序修改為#include"stdio.h"intmain(){inta[5],*p;for(p=a;p<a+5;p++){scanf("%d",p);}for(p=a;p<a+5;p++){printf("%3d",*p);}printf("\n");return0;}如果有定義:inta[5],*p;p=a;指針與數(shù)組元素的關(guān)系歸納如下:

①&a[j],a+j,p+j等價(jià),代表a數(shù)組第j+l個(gè)元素的地址。②a[j],*(a+j),p[j],*(p+j)等價(jià),代表a數(shù)組第j+l個(gè)元素的值。③*(p++)等價(jià)于a[j++]、*(p--)等價(jià)于a[j--]、*(++p)等價(jià)于a[++j]、*(--p)等價(jià)于a[--j]。數(shù)組元素表示方法a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9][]變址運(yùn)算符a[i]

*(a+i)a[i]

p[i]

*(p+i)

*(a+i)*a*(a+1)*(a+2)*(a+9)inta[10];a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針?lè)?p*(p+1)*(p+2)*(p+9)p[0]p[1]p[2]p[9]a[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引用方法main(){inta[5],*p,i;for(i=0;i<5;i++) a[i]=i+1;

pa=a;for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("p[%d]:%d\n",i,p[i]);for(i=0;i<5;i++) printf("*(p+%d):%d\n",i,*(p+i));}12345p使用指針變量是應(yīng)該注意以下幾問(wèn)題:①不要使用沒(méi)有賦值的指針變量,只用指針之前一定要對(duì)它正確的賦值。②使用指針變量訪問(wèn)數(shù)組元素時(shí),要隨時(shí)檢查指針的變化范圍和指針當(dāng)前的值,使指針的指向不能超過(guò)數(shù)組的上下界。#include"stdio.h"voidmain(){inta[10],*p=a,j;for(j=0;j<10;j++){scanf("&d",p++);}for(j=0;j<10;j++){printf("%3d",*p++);}printf("\n");}#include"stdio.h"voidmain(){inta[10],*p=a,j;for(j=0;j<10;j++){scanf("&d",p++);}

p=a;for(j=0;j<10;j++){printf("%3d",*p++);}printf("\n");}③無(wú)論傳遞數(shù)組的首地址的函數(shù)參數(shù)用數(shù)組名還是指針,其實(shí)質(zhì)都是指針,在函數(shù)被調(diào)用時(shí),該指針通過(guò)參數(shù)傳遞均指向數(shù)組?!纠?.3】下面的程序用于演示數(shù)組和指針變量作為函數(shù)的參數(shù),實(shí)現(xiàn)的功能是輸入幾個(gè)學(xué)生的成績(jī),求其平均成績(jī)。方法一:實(shí)參用指針變量,形參用數(shù)組名。#defineN5floataver(floatp[]){inti;floatav,s=0;for(i=0;i<N;i++)s+=p[i];av=s/N;return(av);}voidmain(){floatscore[N],av,*p=score;inti;printf("請(qǐng)輸入5個(gè)學(xué)生的成績(jī)!");for(i=0;i<N;i++)scanf("&f",&score[i]);av=aver(p);printf("這5個(gè)學(xué)生的平均成績(jī)是%5.2f",av);}形參用數(shù)組實(shí)參用指針?lè)椒ǘ簩?shí)參用數(shù)組名,形參用指針變量。#defineN5floataver(float*pa)

{inti;floatav,s=0;for(i=0;i<N;i++)s+=*pa++;av=s/N;return(av);}voidmain(){floatscore[N],av;inti;printf("請(qǐng)輸入5個(gè)學(xué)生的成績(jī)!");for(i=0;i<N;i++)scanf("&f",&score[i]);av=aver(score);

printf("這5個(gè)學(xué)生的平均成績(jī)是%5.2f",av);}形參用指針實(shí)參用數(shù)組方法三:實(shí)參用指針變量,形參也用指針變量。#defineN5floataver(float*pa){inti;floatav,s=0;for(i=0;i<N;i++)

s+=*pa++;av=s/N;return(av);}voidmain(){floatscore[N],av,*p=score;

inti;printf("!");for(i=0;i<N;i++)

scanf("&f",&score[i]);av=aver(p);

printf("%5.2f",av);}以上幾種方法,實(shí)質(zhì)上都是地址的傳遞,方法一的形參是數(shù)組名,方法二和方法三的形參是指針變量,由于數(shù)組名代表數(shù)組的首地址,所以實(shí)現(xiàn)的效果是一樣的。形參用指針實(shí)參用指針#defineN5voidmain(){inta[N],*p;intcount=0,sum=0;printf("%d!",N);for(p=a;p<a+N;p++){scanf("%d",p);if(*p>0){sum+=*p;count++;}}p=a;while(p<a+N)

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

printf("count=%d\n",count);

printf("sum=%d\n",sum);

return0;}【例9.4】輸入n個(gè)數(shù),對(duì)其中的正數(shù)統(tǒng)計(jì)個(gè)數(shù)并求和,程序最后輸出原始數(shù)據(jù)和統(tǒng)計(jì)結(jié)果。將【例8.8】冒泡法排序的程序通過(guò)指針的方法修改如下:#include"stdio.h"#defineM5voidsort(intv[],intn){inti,j,temp;for(i=0;i<n;i++){for(j=n-1;j>i;j--){if(v[j-1]>v[j]){temp=v[j-1];v[j-1]=v[j];

v[j]=temp;}}}return0;}voidprint(intv[],intn)

{inti;for(i=0;i<n;i++)

{printf("%d",v[i]);}printf("\n");return0;}main(){inti,a[M];for(i=0;i<M;i++)

{scanf("%d",&a[i]);}sort(a,M);

print(a,M);return0;}【例9.5】用選擇法對(duì)數(shù)組元素按照從大到小的順序排序voidmain(){voidsort(intx[],intn);int*p,i,a[10];p=a;for(i=0;i<10;i++)scanf("%d",p++);p=a;sort(p,10);for(p=a,i=0;i<10;i++){printf("%d",*p);p++;}return0;}voidsort(intx[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(x[j]>x[k])k=j;if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}}return0;}voidsort(int*x,intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(*(x+i)>*(x+k))k=j;if(k!=i){t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;}}return0;}二維數(shù)組邏輯結(jié)構(gòu)inta[3][4];它的邏輯存儲(chǔ)結(jié)構(gòu)指針與二維數(shù)組

a[i]*(*(

a[i]+j)*(a+i)+j)[j]等價(jià)二維數(shù)組的物理存儲(chǔ)inta[3][4];,*p=ap就是p[0]

p+1就是p[1]p+i就是p[i]二維數(shù)組的指針變量

類型標(biāo)識(shí)符(*指針變量名)[長(zhǎng)度];二維數(shù)組的列數(shù)int(*p)[4];表示變量是指針類型小括號(hào)不能掉,缺省的為指針數(shù)組指針與二維數(shù)組的應(yīng)用舉例【例9.6】用指向數(shù)組元素的指針變量輸出數(shù)組元素的值,并統(tǒng)計(jì)其中的正數(shù)。main(){inta[][4]={{1,-2,3,4},{11,-22,33,44},{-55,66,0,-89}};intcount=0,*p;for(p=a[0];p<a[0]+12;p++){if(*p>0)count++;printf("%4d",*p);}printf("\ncount=%d\n",count);}用普通的指針變量來(lái)訪問(wèn)二維數(shù)組的元素【例9.7】有一個(gè)班,3個(gè)學(xué)生,每個(gè)學(xué)生有4門課程,計(jì)算總平均分以及第n個(gè)學(xué)生的成績(jī)。用指向二維數(shù)組的指針變量訪問(wèn)數(shù)組元素search(float(*p)[4],intn){inti;for(i=0;i<4;i++)printf("%6.2f",*(*(p+n)+i));printf("\n");}思考:怎樣查找第m個(gè)學(xué)生第n門課程的成績(jī)?main(){intn;floatscore[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};scanf("%d",&n);average(*score,12);search(score,n);}average(float*p,intn){float*qq;floatsum=0,aver;qq=p+n+1;for(;p<=qq;p++)sum+=*p;aver=sum/n;printf("Average=%5.2f\n",aver);}9.3字符串與指針9.3.1字符串的表示形式在C語(yǔ)言中,可以用兩種方法訪問(wèn)一個(gè)字符串。(1)用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。把字符串的各字符(包括結(jié)束標(biāo)志'\0')依次保存在字符數(shù)組中,利用下標(biāo)變量或數(shù)組名對(duì)數(shù)組進(jìn)行操作。輸出時(shí)用"%s"格式進(jìn)行整體輸出?!纠?.8】定義一個(gè)字符串,對(duì)它初始化,然后輸出該字符串。#include"stdio.h"voidmain(){charstr[]="Cprogram.";printf("%s\n",str);return0;}(2)用字符指針指向一個(gè)字符串也可以直接定義指向字符串的指針變量,利用該指針變量對(duì)字符串進(jìn)行操作?!纠?.9】字符指針應(yīng)用舉例。#include"stdio.h"voidmain(){char*str="Cprogram.";printf("%s\n",str);return0;}對(duì)字符串中字符的存取,既可以使用下標(biāo)的方法,也可以使用指針的方法【例9.10】將字符串a(chǎn)復(fù)制給字符串bmain(){chara[]="Iamaboy.",b[20];inti;for(i=0;*(a+i)!='\0';i++)*(b+i)=*(a+i);*(b+i)='\0';printf("stringais:%s\n",a);printf("stringbis:");for(i=0;b[i]!='\0';i++)printf("%c",b[i]);printf("\n");return0;}也可以使用指針變量,通過(guò)改變指針變量的指向,來(lái)處理所指向的內(nèi)容

【例9.11】用指針變量來(lái)處理【例9.10】的問(wèn)題。main(){chara[]="Iamaboy.",b[20],*p1,*p2;inti;p1=a;p2=b;for(;*p1!='\0';p1++,p2++)*p2=*p1;*p2='\0';printf("stringais:%s\n",a);printf("stringbis:");for(i=0;b[i]!='\0';i++)printf("%c",b[i]);printf("\n");}使用時(shí)應(yīng)注意以下幾個(gè)問(wèn)題:

①字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址。②對(duì)字符數(shù)組作初始化賦值,必須采用外部類型或靜態(tài)類型,而對(duì)字符串指針變量則無(wú)此限制。例如:staticcharst[]={"CLanguage"};char*ps="CLanguage";③對(duì)字符串指針?lè)绞娇梢詫憺椋篶har*ps;*ps="CLanguage";而對(duì)數(shù)組方式:staticcharst[]={"CLanguage"};char*ps="CLanguage";不能寫成:staticcharst[20];st[]={"CLanguage"};9.3.2字符指針作為函數(shù)的參數(shù)將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),一方面可以用字符數(shù)組名做參數(shù),另一方面可以用指向字符串的指針變量做參數(shù),這樣,在被調(diào)函數(shù)中若改變了字符串的內(nèi)容,則主調(diào)函數(shù)中相應(yīng)的字符串的內(nèi)容也隨之改變?!纠?.12】用函數(shù)的調(diào)用實(shí)現(xiàn)字符串的復(fù)制

(1)用字符數(shù)組名作為參數(shù)main(){copy_string(charform[],charto[]);chara[]="Iamateacher.";charb[]="Youareastudent.";printf("strinta:%s\nstringb:%s\n",a,b);printf("copystringa,to,stringb:\n");copy_string(a,b);printf("strinta:%s\nstringb:%s\n",a,b);return0;}copy_string(charform[],charto[]){inti=0;while(form[i]!='\0'){to[i]=form[i];i++;}to[i]='\0';}在main函數(shù)中也可以用字符指針變量作為實(shí)參,先使指針變量a和b分別指向兩個(gè)字符串。main函數(shù)可以做如下修改:

voidmain(){voidcopy_string(charform[],charto[]);charp[]="Iamateacher.";charq[]="Youareastudent.";char*a=p,*b=q;printf("strinta:%s\nstringb:%s\n",a,b);printf("copystringa,to,stringb:\n");copy_string(a,b);printf("strinta:%s\nstringb:%s\n",a,b);return0;}voidmain(){voidcopy_string(char*form,char*to);charp[]="Iamateacher.";charq[]="Youareastudent.";char*a=p,*b=q;printf("strinta:%s\nstringb:%s\n",a,b);printf("copystringa,to,stringb:\n");copy_string(a,b);printf("strinta:%s\nstringb:%s\n",a,b);return0;}(2)形參用字符指針變量

voidcopy_string(char*form,char*to){for(;*form!='\0';form++,to++){*to=*form;}*to='\0';return0;}int*pb[2]pb[0]pb[1]intb[2][3]123246指針數(shù)組用途:用于處理二維數(shù)組或多個(gè)字符串指針數(shù)組定義形式:

[存儲(chǔ)類型]數(shù)據(jù)類型*數(shù)組名[數(shù)組長(zhǎng)度];指針本身的存儲(chǔ)類型指針?biāo)赶蜃兞康臄?shù)據(jù)類型例int*p[4];指針數(shù)組賦值與初始化賦值:main(){intb[2][3],*p[2];

p[0]=b[0];p[1]=b[1];……..}初始化:main(){intb[2][3],*p[]={b[0],b[1]};……..}賦值:main(){chara[]="Fortran";charb[]="Lisp";charc[]="Basic";

char*p[4];

p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;……..}指針數(shù)組賦值與初始化或:main(){char*p[4];p[0]="Fortran";p[1]="Lisp";p[2]="Basic";p[3]=NULL;……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0指針數(shù)組賦值與初始化初始化:main(){char*p[]={"Fortran","Lisp","Basic",NULL};……..}0

charname[5][9]={"gain","much","stronger","point","bye"};

char*name[5]={"gain","much","stronger","point","bye"};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二維數(shù)組存儲(chǔ)空間固定字符指針數(shù)組相當(dāng)于可變列長(zhǎng)的二維數(shù)組指針數(shù)組元素的作用相當(dāng)于二維數(shù)組的行名但指針數(shù)組中元素是指針變量二維數(shù)組的行名是地址常量二維數(shù)組與指針數(shù)組區(qū)別:main(){intb[2][3],*p[2];inti,j;for(i=0;i<2;i++)for(j=0;j<3;j++) b[i][j]=(i+1)*(j+1);

p[0]=b[0];p[1]=b[1];for(i=0;i<2;i++)for(j=0;j<3;j++)printf("b[%d][%d]:%2d\n",i,j,*(p[i]+j));}例用指針數(shù)組處理二維數(shù)組int*p[2]p[0]p[1]intb[2][3]b[0][0]*(p[0]+0)b[0][1]*(p[0]+1)b[0][2]*(p[0]+2)b[1][0]*p([1]+0)b[1][1]*(p[1]+1)b[1][2]*(p[1]+2)123246b[0][0]:1b[0][1]:2b[0][2]:3b[1][0]:2b[1][1]:4b[1][2]:6例對(duì)字符串排序(簡(jiǎn)單選擇排序)main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};intn=5;sort(name,n);

print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkjkjjji=0strcmp(name[k],name[j])

比較規(guī)則:兩個(gè)字符串自左向右逐個(gè)字符比較(按ASCII值大小比較),直到出現(xiàn)不同的字符或遇到'\0'為止。如果全部字符相同,認(rèn)為兩個(gè)字符串相等;若出現(xiàn)不相同的字符,則以第一個(gè)不相同的字符的比較結(jié)果為準(zhǔn)。(1)如果字符串1=字符串2,則函數(shù)返回值為0。(2)如果字符串1>字符串2,則函數(shù)返回值為一正整數(shù)。(3)如果字符串1<字符串2,則函數(shù)返回值為一負(fù)整數(shù)。main(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};intn=5;sort(name,n);

print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}i=1name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkjjjkkmain(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};intn=5;sort(name,n);

print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}i=2name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICkjjkmain(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};intn=5;sort(name,n);

print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}i=3name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICjkmain(){voidsort(char*name[],intn),print(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};intn=5;sort(name,n);

print(name,n);}voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;if(k!=i){temp=name[i];name[i]=name[k];name[k]=temp;}}}name[0]name[1]name[2]name[3]name[4]nameGreatWallFORTRANComputerFollowmeBASICmax…...指令1指令2函數(shù)返回值的數(shù)據(jù)類型專門存放函數(shù)入口地址可指向返回值類型相同的不同函數(shù)函數(shù)指針變量指向的函數(shù)必須有函數(shù)說(shuō)明()不能省int(*p)()與int*p()不同指向函數(shù)的指針函數(shù)指針:函數(shù)在編譯時(shí)被分配的入口地址,用函數(shù)名表示指向函數(shù)的指針變量定義形式:

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

(*指針變量名)();

如int(*p)();函數(shù)指針變量賦值:如p=max;函數(shù)調(diào)用形式:

c=max(a,b);

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

c=p(a,b);對(duì)函數(shù)指針變量p

n,p++,p--無(wú)意義例用函數(shù)指針變量調(diào)用函數(shù),兩個(gè)數(shù)較大的數(shù)main(){intmax(int,int);inta,b,c;scanf("%d,%d",&a,&b);

c=max(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}main(){intmax(int,int),(*p)();inta,b,c;

p=max;scanf("%d,%d",&a,&b);c=(*p)(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}例用函數(shù)指針變量作參數(shù),求最大值、最小值和兩數(shù)之和main(){inta,b,max(int,int);intmin(int,int),add(int,int);voidprocess(int,int,int(*fun)());scanf("%d,%d",&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);}voidprocess(intx,inty,int(*fun)()){intresult;result=(*fun)(x,y);printf("%d\n",result);}max(intx,inty){printf(“max=”);return(x>y?x:y);}min(intx,inty){pri

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論