9計(jì)算機(jī)二級(jí)語(yǔ)言-指針_第1頁(yè)
9計(jì)算機(jī)二級(jí)語(yǔ)言-指針_第2頁(yè)
9計(jì)算機(jī)二級(jí)語(yǔ)言-指針_第3頁(yè)
9計(jì)算機(jī)二級(jí)語(yǔ)言-指針_第4頁(yè)
9計(jì)算機(jī)二級(jí)語(yǔ)言-指針_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章指針3/20/202411引例●三人欲借用某旅館的一個(gè)房間,A先到達(dá),在旅館的效勞臺(tái)登記房間,房號(hào)是5818,然后A打通知了B,但是沒有通知C,問B和C怎么找到A?B可以直接到5818房間找到AC到旅館效勞臺(tái)查詢A的房號(hào)為5818,然后再找到A2§9.1地址和指針的概念●一、變量的地址計(jì)算機(jī)中,數(shù)據(jù)存儲(chǔ)在內(nèi)存中.內(nèi)存可以劃分為假設(shè)干個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元可以存放8位bit二進(jìn)制數(shù),即1個(gè)字節(jié)byte.內(nèi)存當(dāng)中采用線性地址編碼,每個(gè)單元具有唯一一個(gè)地址編碼.1、變量的地址:

系統(tǒng)為變量單元分配的內(nèi)存地址——一個(gè)無(wú)符號(hào)整數(shù)inta;floatb;a=3;b=5;a3AB0b3AC02、變量的屬性存儲(chǔ)內(nèi)容:數(shù)據(jù)值空間大小:數(shù)據(jù)類型

空間位置:地址生存周期:存儲(chǔ)類別353§9.1地址和指針的概念二、變量的訪問方式1、直接訪問2、間接訪問:定義一個(gè)變量p,存放a的地址,通過p來(lái)訪問aintafloatba=3;b=5;假設(shè)將p中地址換成3AC0(B的地址),那么可以通過p來(lái)訪問B3a3AB05b3AC03AB0p4§9.1地址和指針的概念三、指針變量指針變量是存放地址的變量;如何定義p?如何獲得變量a的地址,即p中的內(nèi)容?如何通過p來(lái)訪問a?如:p為指針變量,它存放整型變量a的首地址,那么稱指針變量p指向整型變量a。3a3AB05b3AC03AB0p5§9.2指針變量的定義與引用●一、定義方法類型符*指針變量名

指針變量的類型:指針?biāo)赶騼?nèi)存單元中存放的數(shù)據(jù)的類型.int*p1,*p2;char*ps;float*pf1,*pf2;(1)用變量地址給指針變量賦值(使用到地址符&)指針說明符●二、指針變量的賦值

指針變量的值為地址,是個(gè)無(wú)符號(hào)整數(shù).

不能直接將一個(gè)整數(shù)常量賦值給指針變量int*p1p1=0X1234int*p,a,b;p=&a;注:變量的類型必須與指針變量類型相同(2)用相同類型的指針變量賦值int*p1,*p2,a;p1=&a;p2=p1;注:假設(shè)不賦值,那么指針變量的值是隨機(jī)的.(3)賦空值NULLint*p1;p1=NULL;或p1=0;int*p1=NULL;floata;float*p2=&a;charch,*p3=&ch;6§9.2指針變量的定義與引用●三、指針變量的應(yīng)用1.兩個(gè)有關(guān)的運(yùn)算符:*,&

形式:&任意變量

/*取變量地址運(yùn)算符*/

*指針變量

/*指針運(yùn)算符*/含義:

&a表示變量a所占據(jù)的內(nèi)存空間的首地址;*p表示指針變量p所指向的內(nèi)存單元中的數(shù)據(jù).如果:p=&a;*pa①將指針變量指向被訪問的變量如:inta=5,*p,b;p=&a;應(yīng)用:通過指針變量指向所指的變量,即通過p訪問a;〔步驟〕②訪問所指變量

取內(nèi)容:b=*p;printf(“%d\n”,b);③存內(nèi)容:*p=100;例9-1voidmain()

{inta=5,b=3;int*p;p=&a;b=*p+5;printf(“%d\n”,b);*p=4;printf(“%d,%d\n”,a,*p);}注意:*p假設(shè)出現(xiàn)在“=”右邊或其他表達(dá)式中那么為取內(nèi)容;*p假設(shè)出現(xiàn)在“=”左邊那么存內(nèi)容,即向內(nèi)存中寫數(shù)據(jù).7§9.2指針變量的定義與引用●三、指針變量的應(yīng)用2.運(yùn)算規(guī)那么&,*優(yōu)先級(jí)相同,且為右結(jié)合※與++.--.!等單目運(yùn)算符優(yōu)先級(jí)相同※高于算術(shù)運(yùn)算符*,/,%①printf():從右到左輸出②(*q)++和*(q++)兩者不同

內(nèi)容++地址++例9-1voidmain()

{inta=2,*p=&a,*q=&a;printf(“%d,%d\n”,*p++,*(q++));p=&a,q=&a;printf(“%d,%d\n”,*p,(*q)++);}假設(shè)有:inta=5,*p=&a;寫出下面表達(dá)式的結(jié)果,并找出等價(jià)的表達(dá)式&*p*&a(*p)++&aa*p++*(p++)a++思考:以下表達(dá)式是什么意思?&*p*&a牢記以下等價(jià)式:int*p=&a;&*pp*&aa&ap*pa結(jié)果:2232要求:*后一定是指針變量;…...…...200020002002200420062apq20008例9-2#include<stdio.h>voidmain(){inta,b,c;int*pa,*pb,*pc;pa=&a;pb=&b;pc=&c;scanf(“%d%d”,pa,pb);printf(“a=%d,b=%d\n”,*pa,*pb);c=a+b;printf(“c=%d\n”,*pc);*pc=a+*pb;printf(“c=%d\n”,c);c=*pa**pb;printf(“c=%d\n”,c);c=++*pa+(*pb)++;printf(“c=%d\n”,c);c=(*pa)+++*pb;printf(“c=%d\n”,c);printf(“a=%d,b=%d\n”,a,b);}假設(shè)輸入為:239例9-3交換兩個(gè)數(shù)a,b的值#include<stdio.h>voidmain(){inta=5,b=8;intt;printf(“a=%d,b=%d\n”,a,b);t=a;a=b;b=t;printf(“a=%d,b=%d\n”,a,b);}例9-3交換兩個(gè)數(shù)a,b的值#include<stdio.h>voidmain(){inta=5,b=8;int*pa=&a,*pb=&b;intt;printf(“a=%d,b=%d\n”,a,b);t=*pa;*pa=*pb;*pb=t;printf(“a=%d,b=%d\n”,a,b);}10§9.2指針變量的定義與引用●四、指針變量作函數(shù)參數(shù)例9-4編寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換#include<stdio.h>voidswap(intx,inty){intt;t=x;x=y;y=t;}voidmain(){inta=3,b=5;swap(a,b);printf(“%d%d\n”,a,b);}#include<stdio.h>voidswap(int*x,int*

y){intt;t=*

x;*

x=*

y;*

y=t;}voidmain(){inta=3,b=5;swap(&a,&b);printf(“%d%d\n”,a,b);}voidswap(int*x,int*

y){int*t;t=x;x=y;

y=t;}voidswap(int*x,int*

y){int*t;

*

t=*

x;*

x=*

y;*

y=*

t;}*t未賦初值,系統(tǒng)會(huì)隨機(jī)給值,可能指向一個(gè)已有數(shù)據(jù)的存儲(chǔ)單元,再執(zhí)行交換,就會(huì)破壞已有數(shù)據(jù)。11例9-5輸入a,b,c三個(gè)數(shù),按從大到小輸出#include<stdio.h>voidswap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}voidmain(){inta,b,c;printf(“enterdataa,b,c:”);scanf(“%d%d%d”,&a,&b,&c);if(a<b)swap(&a,&b);if(a<c)swap(&a,&c);if(b<c)swap(&b,&c);printf(“a=%d,b=%d\n”,a,b);}12§9.3指針和數(shù)組●一、一維數(shù)組與指針1.數(shù)組是連續(xù)存放假設(shè)干數(shù)據(jù)的集合.2.數(shù)組名就是指向這個(gè)數(shù)組第1個(gè)元素的指針(首地址)例如:inta[10],*p;那么p=ap=&a[0];3.某一元素地址:p=&a[i];引用該元素:*p

a[i]注意:數(shù)組名a(數(shù)組的指針)與指向數(shù)組首地址的指針變量p不同,a是地址常量不能賦值,也不能進(jìn)行自增自減運(yùn)算。4.數(shù)組元素地址在內(nèi)部實(shí)現(xiàn)時(shí),統(tǒng)一按照”基地址+位移”方式處理:如:aa+1a+i故元素的地址可以表示為:p+ia+i(數(shù)組指針)5.數(shù)組元素的內(nèi)容可以表示為:a[i](數(shù)組下標(biāo))*(p+i)*(a+i)(指針表示)13例9-6讀程序?qū)懗鼋Y(jié)果#include<stdio.h>voidmain(){inta=3,b=5;int*p=&a;printf(“%d\n”,*p);*p=4;p=&b;printf(“%d\n”,*p);*p=6;printf(“%d,%d\n”,a,b);}例9-6讀程序?qū)懗鼋Y(jié)果#include<stdio.h>voidmain(){inti,a[5];int*p;for(i=0;i<5;i++){p=&a[i];a[i]=i;printf(“%3d”,*p);}printf(“\n”);}例9-6讀程序?qū)懗鼋Y(jié)果#include<stdio.h>voidmain(){inti,a[5];int*p=a;for(i=0;i<5;i++,p++){

*p=i;printf(“%3d”,a[i]);}printf(“\n”);}14§9.3指針和數(shù)組●一、一維數(shù)組與指針數(shù)組指針.指針變量.數(shù)組元素之間的關(guān)系設(shè)有inta[10],*p=a;那么地址關(guān)系內(nèi)容關(guān)系15§9.3指針和數(shù)組●一、一維數(shù)組與指針例9-7讀程序,理解書寫上的變化#include<stdio.h>voidmain(){inti,a[5];printf(“input5numbers:\n”);for(i=0;i<5;i++)scanf(“%d”,&a[i]);printf(“outputthesenumbers:\n”);for(i=0;i<5;i++)printf(“%d”,a[i]);printf(“\n”);}scanf(“%d”,a+i);scanf(“%d”,p+i);printf(“%d“,*(a+i));printf(“%d“,*(p+i));int*p=a;16§9.3指針和數(shù)組●二、指針的運(yùn)算1.賦值運(yùn)算:如:p=&x;p=NULL;p=a;注:指針類型相同2.加減運(yùn)算:用法:指針+(-)整數(shù)如:a+ip+i3.指針相減的運(yùn)算,求兩地址的間距:

指針–指針如p-a注:只能用于數(shù)組元素的引用,注意下標(biāo)的范圍.注:兩指針類型相同,并指向同一連續(xù)存儲(chǔ)區(qū)域.4.移動(dòng)指針運(yùn)算:如p++p--注:對(duì)數(shù)組名不能實(shí)行移動(dòng)5.指針比較運(yùn)算:指針運(yùn)算符指針如:p<a比較地址注:2~5的運(yùn)算通常應(yīng)用于指向數(shù)組的指針17§9.3指針和數(shù)組●二、指針的運(yùn)算例9-8將a數(shù)組中的內(nèi)容復(fù)制到b數(shù)組中#include<stdio.h>#defineM7voidmain(){inti,a[M]={23,15,50,3,21,20,35};intb[M];for(i=0;i<M;i++)b[i]=a[i];printf(“outputthesenumbers:\n”);for(i=0;i<5;i++)printf(“%d”,b[i]);printf(“\n”);}printf(“%d”,*q++);結(jié)果如何?18§9.3指針和數(shù)組●三、數(shù)組的指針與函數(shù)參數(shù)形式一:voidf(intx[],intn){}voidmain(){inta[10];……f(a,10);}數(shù)組名作為函數(shù)參數(shù),實(shí)參與形參對(duì)應(yīng)關(guān)系可歸納為四種情況:形式二:voidf(int*x,intn){}voidmain(){inta[10];……f(a,10);}形式三:voidf(int*x,intn){}voidmain(){inta[10],*p=a;……f(p,10);}形式四:voidf(intx[],intn){}voidmain(){inta[10],*p=a;……f(p,10);}19§9.3指針和數(shù)組例9-9編寫一個(gè)函數(shù)求一維數(shù)組最大元素以及下標(biāo)(使用指針).:數(shù)組首地址為p,元素個(gè)數(shù)為n.(作函數(shù)參數(shù))結(jié)果:下標(biāo)k(函數(shù)返回值)intmax_array(int*p,intn)設(shè)最大值放在max中,那么初始狀態(tài)為:max=*p,k=0;如果*(p+i)>max那么max=*(p+i),k=i;#include<stdio.h>intmax_array(int*p,intn){intk=0,i,max=*p;for(i=1;i<n;i++)

if(*(p+i)>max){max=*(p+i);k=i;}returnk;}voidmain(){inta[10]={23,43,52,23,5,22,33,35,96,34};inti,*p=a,k;for(i=0;i<10;i++)printf(“%5d”,*(p+i));k=max_array(a,10);printf(“max=a[%d]=%d\n”,k,*(p+k));}p++,i++)*p*p*p++;20§9.3指針和數(shù)組例9-10編寫一個(gè)函數(shù)將一維數(shù)組倒置存放(使用指針).:數(shù)組首地址為p,元素個(gè)數(shù)為n.(作函數(shù)參數(shù))結(jié)果:倒置后的一維數(shù)組函數(shù)定義:intinverse(inta[],intn)或intinverse(int*p,intn)算法:1.令p指向數(shù)組開始,q指向數(shù)組結(jié)束;#include<stdio.h>voidinverse(int*p,intn){int*q,t;q=p+n-1;while(p<q){t=*p;*p=*q;*q=t;p++;q--;}}voidmain(){inta[]={1,3,5,7,9};intk,*p=a;for(k=0;k<5;k++)printf(“%4d”,*p++);putchar(‘\n’);inverse(a,5);for(p=a,k=0;k<5;k++)printf(“%4d”,*p++);putchar(‘\n’);}voidinverse(inta[],intn){int*q,t,i=0;q=a+n-1;while(a+i<q){t=*(a+i);*(a+i)=*q;*q=t;i++;q--;}}2.交換兩個(gè)單元內(nèi)容;3.兩個(gè)指針向中央靠攏;4.重復(fù)2和3,直到p>=q;21§9.3指針和數(shù)組例9-11求某班某門課的平均成績(jī),統(tǒng)計(jì)超過平均值的人數(shù)(使用指針完成)分析:1.令p指向score(存放成績(jī)的數(shù)組)的開始;2.通過移動(dòng)指針求和;5.不移動(dòng)指針但通過指針判斷各單元的內(nèi)容是否大于平均值;并記數(shù).#include<stdio.h>#defineN30voidmain(){floatscore[N],*p;floatv,s=0;intk,num=0;for(p=score,k=0;k<N;k++){scanf(“%f”,p);s+=*p;p++;}v=s/N;

for(p=score,k=0;k<N;k++)if(*(p+k)>v)num++;printf(“average=%.2f,\num%d\n”,v,num);}3.求平均值;4.令p重新指向score的開始;2201020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];

①二維數(shù)組名a是數(shù)組的首地址。②二維數(shù)組a包含三個(gè)行元素:a[0]、a[1]、a[2]

。a[0]a[1]a[2]a三個(gè)行元素的地址分別是:a、a+1、a+2。而a[0]、a[1]、a[2]也是地址量,是一維數(shù)組名,即*(a+0)、*(a+1)、*(a+2)是一維數(shù)組首個(gè)元素地址?!袼?、二維數(shù)組與指針

a+1a+2§9.3指針和數(shù)組23⑵二維數(shù)組元素的地址

a[0]、a[1]、a[2]是一維數(shù)組名,所以a[i]+j是數(shù)組元素的地址。數(shù)組元素a[i][j]的地址可以表示為以下形式:&a[i][j]、a[i]+j、*(a+i)+j01020111212122231323a[0]數(shù)組a[1]數(shù)組a[2]數(shù)組a[2]+1a[2]+2a[2]+3a[0]+1a[0]+2a[0]+3§9.3指針和數(shù)組●四、二維數(shù)組與指針

24⑶二維數(shù)組元素的表示法數(shù)組元素可用以下形式表示:a[i][j]、*(a[i]+j)、*(*(a+i)+j)

a

是二維數(shù)組,根據(jù)C的地址計(jì)算方法,a經(jīng)過兩次

*

操作才能訪問到數(shù)組元素。所以

*

a是

a[0],*

*

a才是a[0][0]。

a[0]是a[0][0]的地址,*a[0]是a[0][0]。01020111212122231323a[0]a[1]a[2]a●四、二維數(shù)組與指針

§9.3指針和數(shù)組25⑷指向二維數(shù)組元素的指針變量【例9-12】用指向數(shù)組元素的指針變量輸出數(shù)組元素。main(){inta[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}},i,j,*p;for(p=a[0],i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(p+i*4+j));/*元素的相對(duì)位置為i*4+j*/printf("\n");}}這種指針變量的定義及使用與指向一維數(shù)組元素的

指針變量是相同的,用它存放二維數(shù)組元素的地址。01020111212122231323ap§9.3指針和數(shù)組●四、二維數(shù)組與指針

26⑸指向一維數(shù)組的指針變量

指向一維數(shù)組指針變量的定義形式:數(shù)據(jù)類型標(biāo)識(shí)符(*變量名)[元素個(gè)數(shù)]

“*”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個(gè)數(shù)。由于“*”比“[]”的運(yùn)算級(jí)別低,“*變量名”作為一個(gè)說明部分,兩邊必須加括號(hào)。“數(shù)據(jù)類型標(biāo)識(shí)符”是定義一維數(shù)組元素的類型?!袼?、二維數(shù)組與指針

§9.3指針和數(shù)組27【例9-13】用指向一維數(shù)組的指針變量輸出數(shù)組元素。main(){inta[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}};int(*lp)[4],i,j;for(lp=a,i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(*(lp+i)+j));printf("\n");}}01020111212122231323alplp+1lp+2

0123

10111213

20212223§9.3指針和數(shù)組●四、二維數(shù)組與指針

28【例9-13】用指向一維數(shù)組的指針變量輸出數(shù)組元素。main(){inta[][4]={0,1,2,3,10,11,12,13,20,21,22,23};int(*lp)[4],j;for(lp=a;lp<a+3;lp++){for(j=0;j<4;j++)printf("%4d",*(*lp+j));printf("\n");}}01020111212122231323alplplplp

0123

10111213

20212223

●四、二維數(shù)組與指針

§9.3指針和數(shù)組29§9.4指針和字符串一、字符串指針C語(yǔ)言中字符串是以’\0’為結(jié)尾的字符序列;用字符數(shù)組存放字符串(即將以’\0’為結(jié)尾字符數(shù)組看作字符串);字符串指針就是字符數(shù)組的首地址;如:chara[]=“Apple”;charb[]={‘C’,’h’,’i’,’n’,’a’,’\0’}int*p,*q;p=123;q=&123;*p=123;定義:char*指針變量char*p,*q=“Language”;p=“Thisisabook.”;二、字符串指針變量char*p,c[10];p=c;注意:p是指向字符串首地址,不是存放字符數(shù)組30§9.4指針和字符串例9-14逆序打印字符串算法:設(shè)字符串為q;令p指向字符串結(jié)尾;

打印字符*p,并將p向前移動(dòng);直到p移到字符串首q位置.#include<stdio.h>voidmain(){char*p,*q=“Language”;

for(p=q;*p!=‘\0’;)p++;for(p--;p>=q;p--)putchar(*p);putchar(‘\n’);}#include<stdio.h>#include<string.h>voidmain(){char*p,*q=“Language”;

intn;n=strlen(q);p=q+n;for(p--;p>=q;p--)putchar(*p);putchar(‘\n’);}31§9.4指針和字符串例9-15編寫一個(gè)函數(shù)判斷一個(gè)字符串是否是回文(順序與逆序相同):字符串指針變量為p(函數(shù)參數(shù))結(jié)果:是(1),否(0)(返回值)intishuiwen(char*p){char*q=p;while(*q!=‘\0’)q++;q--;while(p<q)if(*p==*q){p++;q--;}elsereturn0;return1;}算法:1.令q指向最后一個(gè)字符;2.假設(shè)*p=*q,那么兩指針向中間靠攏,直到p>=q,返回1;3.假設(shè)*p!=*q,那么返回0.intishuiwen(char*p){char*q=p;while(*q)q++;q--;while(p<q)if(*p++!=*q--)return0;return1;}32§9.4指針和字符串三、字符數(shù)組與字符指針變量的比較chara[]=“Ilovethisgame”,*p=a;1.存儲(chǔ)的內(nèi)容不同:字符數(shù)組可以存字符串,存的是字符;字符指針變量存的是字符串在內(nèi)存中首地址;chara[10],*p;p=“china”;a=“china”;3.當(dāng)沒有賦值時(shí):字符數(shù)組名代表了一個(gè)確切的地址;字符指針變量中的地址是不確定的.2.賦值方式不同:字符數(shù)組只能對(duì)各元素賦值;(一次只能賦一個(gè)字符)字符數(shù)組指針只賦值一次,賦的是數(shù)組首地址.Ilovethisgame數(shù)組a變量p300A300Achara[10],*p;scanf(“%s”,a);scanf(“%s”,p);33§9.4指針和字符串三、字符數(shù)組與字符指針變量的比較chara[]=“Ilovethisgame”,*p=a;4.字符數(shù)組名不是變量,不能改變值;字符指針變量可以改變值;chara[10],*p;a++;p++;6.字符串指針變量的應(yīng)用:例如:可以用指針變量指向一個(gè)格式字符串,在printf中直接使用此指針變量.5.可以象數(shù)組那樣使用下標(biāo)引用字符數(shù)組指針變量所指字符串中的字符.char*p=“abcd”;putchar(p[3]);p[2]=‘x’;char*fmt=“a=%d,b=%d,c=%d\n”;printf(fmt,a,b,c);

printf(“a=%d,b=%d,c=%d\n”,a,b,c);34§9.4指針和字符串三、字符數(shù)組與字符指針變量的比較7.以下的形式那些是正確的:chard[10],*q=d;intx=5,*p=&x;d=“apple”;scanf(“%s”,d);printf(“%s”,d);q=“pear”;scanf(“%s”,q);printf(“%s”,q);*q=“orange”;printf(“%s”,*q);*p=100;scanf(“%d”,p);printf(“%d”,*p);×√√√√√√√××√35指針數(shù)組定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符

*數(shù)組名[元素個(gè)數(shù)];在這個(gè)定義中由于“[

]”比“*”的優(yōu)先級(jí)高,所以數(shù)組名先與“[元素個(gè)數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個(gè)元素是指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”說明指針的目標(biāo)變量的數(shù)據(jù)類型。例如:int*ip[10];char*cp[5];1.指針數(shù)組的定義

指針數(shù)組就是數(shù)組中的每個(gè)元素均為指針類型

§9.5指針數(shù)組362.指針數(shù)組初始化

cpC數(shù)組cp[0]Fortran\0cp[1]COBOL\0cp[2]BASIC\0cp[3]Pascal\0例如:charc[4][8]={"Fortran","COBOL","BASIC","Pascal"};char*cp[4]={c[0],c[1],c[2],c[3]};/*VC中合法,TC中不合法*/char*str[5]={"int","long","char","float","double"};str[0]int\0str[1]long\0str[2]char\0str[3]float\0str[4]double\0§9.5指針數(shù)組37【例9-16】用0~6分別代表星期日至星期六,當(dāng)輸入其中任意

一個(gè)數(shù)字時(shí),輸出相應(yīng)英文單詞。main(){char*weekname[7]={"Sunday","Monday","Tuesday",

"Wednesday","Thursday","Friday","Saturday"};intweek;printf("EnterweekNo.:");scanf("%d",&week);if(week>=0&&week<7)

printf("weekNo.%d——%s\n",week,weekname[week]);}3.利用字符指針數(shù)組處理多個(gè)字符串

利用字符指針數(shù)組處理長(zhǎng)度不等的字符串,可節(jié)省存儲(chǔ)空間。

§9.5指針數(shù)組381.二級(jí)指針變量的定義

整型值整型變量整型變量地址一級(jí)指針變量一級(jí)指針變量地址二級(jí)指針變量如果一個(gè)指針的目標(biāo)變量是一個(gè)指針類型變量,那么此指針為指向指針的指針變量,也稱為多級(jí)指針變量。二級(jí)指針變量定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符**指針變量名;其中“**指針變量名”相當(dāng)于*(*指針變量名〕,在括號(hào)中定義了一個(gè)指針變量,括號(hào)外的“*”,說明指針變量〔即二級(jí)指針〕的目標(biāo)變量是一個(gè)指針類型數(shù)據(jù),“數(shù)據(jù)類型標(biāo)識(shí)符”是目標(biāo)變量〔即一級(jí)指針〕所指向的數(shù)據(jù)的類型,也就是最終目標(biāo)變量的類型。例如:inta,*p,**pp;§9.5多級(jí)指針392.二級(jí)指針變量初始化

a的內(nèi)容a&ap&ppp例如:inta,*p=&a,**pp=&p;、*p、**pp、*pp§9.5多級(jí)指針40【例9-17】利用二級(jí)指針輸出字符串。main(){staticchar*name[]={"Zhang","Wang","Li",""};char**pp=name;while(**pp!='\0')printf("%s\n",*pp++);}nameZhang\0Wang\0Li\0\0pppppppppppppp*(*pp+1)=h、*(*pp+2)=aZhangWangLi§9.5多級(jí)指針411,一維數(shù)組的指針作函數(shù)參數(shù)

一.數(shù)組的指針作函數(shù)參數(shù)

2,二維數(shù)組的指針作函數(shù)參數(shù)

由于指向二維數(shù)組的指針分為行指針和元素指針,所以他們作為函數(shù)參數(shù)的形式也不同。

①二維數(shù)組的行指針作函數(shù)參數(shù)例如被調(diào)函數(shù)abc的定義形式有以下三種:voidabc(intb[2][4]){……}voidabc(intb[][4]){……}voidabc(int(*b)[4]){……}在主調(diào)函數(shù)有如下定義:inta[2][4],(*p)[4]=a;那么調(diào)用abc函數(shù)時(shí)可用abc(a)或abc(p)§9.5指針與函數(shù)42【例9-18】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為行指針。voidinarr(int(*p1)[4],intm)/*可改寫為voidinarr(intp1[][4],intm)*/{inti,j;for(i=0;i<m;i++)for(j=0;j<4;j++)scanf("%d",*(p1+i)+j);}voidoutarr(int(*p2)[4],intm)/*可改寫為voidoutarr(intp2[3][4],intm)*/{inti,j;for(i=0;i<m;i++){for(j=0;j<4;j++)printf("%6d",p2[i][j]);printf("\n");}}一.數(shù)組的指針作函數(shù)參數(shù)

§9.5指針與函數(shù)voidmain(){inta[3][4],(*p)[4];p=a;

inarr(a,3);outarr(p,3);}43一.數(shù)組的指針作函數(shù)參數(shù)

2,

二維數(shù)組的指針作函數(shù)參數(shù)

②指向二維數(shù)組元素的指針作函數(shù)參數(shù)指向二維數(shù)組元素的指針作函數(shù)參數(shù)時(shí),是利用二維數(shù)組元素按行連續(xù)存儲(chǔ)的的特點(diǎn),訪問數(shù)組的每一個(gè)元素。被調(diào)函數(shù)的形參必須定義為指向二維數(shù)組元素的指針變量。例如被調(diào)函數(shù)abc的定義形式如下:voidabc(int*b){……}在主調(diào)函數(shù)有如下定義:inta[2][4],*p=a[0];那么調(diào)用abc函數(shù)時(shí)可用abc(a[0])、abc(&a[0][0])或abc(p)§9.5指針與函數(shù)44【例9-19】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為指向二維數(shù)組元素的指針。

voidinarr(int*p1,intm,intn){inti,j;for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",p1+n*i+j);}voidoutarr(int*p1,intm,intn){inti,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%6d",*(p1+n*i+j));printf("\n");}}一.數(shù)組的指針作函數(shù)參數(shù)

main(){inta[3][4],*p;p=&a[0][0];inarr(a[0],3,4);outarr(p,3,4);}§9.5指針與函數(shù)45二、帶參數(shù)的主函數(shù)1.帶參數(shù)的主函數(shù)的定義

main(intargc,char*argv[]){……}

main函數(shù)只能有兩個(gè)形參,并且這兩個(gè)形參的類型也是固定的。第一個(gè)形參必須是整型變量,第二個(gè)形參可以定義為字符型指針數(shù)組,也可以定義為二級(jí)字符指針變量,因此也可以寫成

main(int

argc,char**argv)§9.5指針與函數(shù)46二、帶參數(shù)的主函數(shù)2.帶參數(shù)的主函數(shù)的調(diào)用

帶參數(shù)的主函數(shù)調(diào)用形式:可執(zhí)行文件名參數(shù)1參數(shù)2……參數(shù)n在DOS系統(tǒng)提示符下鍵入的這一行字符稱為命令行??蓤?zhí)行文件名稱為命令名,其后的參數(shù)稱為命令行參數(shù),命令名與各參數(shù)之間用空格進(jìn)行分隔。要調(diào)用帶參數(shù)的主函數(shù)必須在操作系統(tǒng)環(huán)境下進(jìn)行。假設(shè)C語(yǔ)言源程序文件file1.c,經(jīng)過編譯、連接生成一個(gè)可執(zhí)行文件file1.exe。在DOS系統(tǒng)提示符后鍵入可執(zhí)行文件名file1,即可執(zhí)行該程序?!?.5指針與函數(shù)47二、帶參數(shù)的主函數(shù)3.主函數(shù)參數(shù)的作用

argc稱作參數(shù)計(jì)數(shù)器,它的值是包括命令名在內(nèi)的參數(shù)個(gè)數(shù)。argv指針數(shù)組的作用是存放命令行中命令名和每個(gè)參數(shù)字符串的首地址。C:\>file1onetwothreeargv[0]file1\0argv[1]one\0argv[2]two\0argv[3]three\0argvargc4§9.5指針與函數(shù)48C:\>二、帶參數(shù)的主函數(shù)【例9-20】顯示命令行參數(shù)程序。voidmain(intargc,char*argv[]){inti=0;while(--argc>0)printf("%s\n",argv[++i]);}file1onetwothree

onetwothree注意:命令行參數(shù)所傳送的數(shù)據(jù)全部都是字符串。即便傳送的是數(shù)字,也是按字符串方式傳送給主函數(shù)。程序中使用這些參數(shù)時(shí),還需要將數(shù)字字符串轉(zhuǎn)換成數(shù)值型數(shù)據(jù)。C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)提供了一些相關(guān)的數(shù)據(jù)類型轉(zhuǎn)換函數(shù),如atoi()、atof(),使用時(shí)應(yīng)包含頭文件

stdlib.h

。49三、指針型函數(shù)1.指針型函數(shù)的定義

指針型函數(shù)定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符*函數(shù)名〔形式參數(shù)表〕{……}其中函數(shù)名前的“*”表示函數(shù)的返回值是一個(gè)指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”是指針?biāo)赶虻哪繕?biāo)變量的類型。如果一個(gè)函數(shù)的返回值是指針,那么稱此函數(shù)為指針型函數(shù)。§9.5指針與函數(shù)50char*subcut(char*a,ints,intlen){staticcharsubstr[SIZE+1];/*substr用于存放子串*/intn;char*ps;ps=substr;if(s<0||s>=strlen(a)||len<1)printf("dataerror\n");/*數(shù)據(jù)錯(cuò),子串為空*/elsefor(n=0,a+=s;n<len&&*a!='\0';n++)*ps++=*a++;*ps='\0';/*復(fù)制結(jié)束參加字符串結(jié)束標(biāo)志*/return(substr);}三、指針型函數(shù)【例9-21】編制一個(gè)函數(shù),其功能是從字符串中指定位置s開始截取一個(gè)長(zhǎng)度為len的子串。思路:在截取子串函數(shù)sutcut中需要從主調(diào)函數(shù)傳送3個(gè)數(shù)據(jù),源字符串、截取位置s、長(zhǎng)度len。在形參中定義一個(gè)指針變量a接收源字符串的首地址,在函數(shù)中再定義一個(gè)存儲(chǔ)類型為static的字符數(shù)組substr用于存放子串,指針變量ps指向substr數(shù)組。在截取子串的過程中,如果起始位置s小于0或大等于源串那么子串為空,如果截取長(zhǎng)度len小于1子串也為空;否那么循環(huán)復(fù)制子串,直到復(fù)制了len個(gè)字符或從源串讀到'\0'結(jié)束。最后函數(shù)將返回substr字符數(shù)組的首地址。假設(shè)起始位置s小于0或大等于源串長(zhǎng)度或截取長(zhǎng)度len小于1從第s個(gè)字符開始,復(fù)制len個(gè)字符

§9.5指針與函數(shù)51三、指針型函數(shù)2.指針型函數(shù)定義時(shí)應(yīng)注意的問題

指針函數(shù)中return的返回值必須是與函數(shù)類型一致的指針。②

返回值必須是外部或靜態(tài)存儲(chǔ)類別的變量指針或數(shù)組指針,以保證主調(diào)函數(shù)能正確使用數(shù)據(jù)。

§9.5指針與函數(shù)52四、指向函數(shù)的指針1.函數(shù)指針變量的定義

函數(shù)指針變量定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符(*函數(shù)指針變量名)();其中“*函數(shù)指針變量名”必須用圓括號(hào)括起來(lái),否那么就成為聲明一個(gè)指針型函數(shù)了。在定義中“(*函數(shù)指針變量名)”右側(cè)的括號(hào)“()”表示指針變量所指向的目標(biāo)是一個(gè)函數(shù),“數(shù)據(jù)類型標(biāo)識(shí)符”是定義指針變量所指向的函數(shù)的類型。例如:int(*p)();/*p是一個(gè)指向整型函數(shù)的指針變量*/float(*q)();/*q是一個(gè)指向單精度實(shí)型函數(shù)的指針變量*/在C語(yǔ)言中,函數(shù)名具有與數(shù)組名類似的特性,數(shù)組名代表數(shù)組的首地址,函數(shù)名代表函數(shù)的起始地址〔即該函數(shù)的程序代碼段在內(nèi)存中所占用的存儲(chǔ)空間的首地址,也稱函數(shù)入口〕。因此也可以把函數(shù)名賦給一個(gè)函數(shù)指針變量,使其成為指向該函數(shù)的指針變量。函數(shù)名那么可以看成是函數(shù)指針常量?!?.5指針與函數(shù)53四、指向函數(shù)的指針2.用函數(shù)指針變量調(diào)用函數(shù)

用函數(shù)指針變量調(diào)用函數(shù)的一般形式:

(*函數(shù)指針變量名)(實(shí)參表);

由于優(yōu)先級(jí)不同“*函數(shù)指針變量名”必須用圓括號(hào)括起來(lái),表示間接調(diào)用指針變量所指向的函數(shù);右側(cè)括號(hào)中為傳遞到被調(diào)函數(shù)的實(shí)參。

函數(shù)指針與變量指針的共同之處是都可以做間接訪問。變量指針指向內(nèi)存的數(shù)據(jù)存儲(chǔ)區(qū),通過間接存取運(yùn)算訪問目標(biāo)變量;函數(shù)指針指向內(nèi)存的程序代碼存儲(chǔ)區(qū),通過間接存取運(yùn)算使程序流程轉(zhuǎn)移到指針?biāo)赶虻暮瘮?shù)入口,取出函數(shù)的機(jī)器指令并執(zhí)行函數(shù),完成函數(shù)的調(diào)用。

§9.5指針與函數(shù)54四、指向函數(shù)的指針main(

){intmax(int,int

),a,b,c;/*聲明被調(diào)用的目標(biāo)函數(shù)max*/int(*p)(int,int);/*定義p為指向整型函數(shù)的指針變量*/p

=

max;/*用指針變量存儲(chǔ)函數(shù)入口地址*/scanf(“%d%d”,&a,&b);c=(*p)(a,b);/*用指針變量調(diào)用函數(shù)*/printf(“max=%d”,c);}max(in

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論