第08章-指針-課件_第1頁
第08章-指針-課件_第2頁
第08章-指針-課件_第3頁
第08章-指針-課件_第4頁
第08章-指針-課件_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第08章指針

本章主要指針的概念、運(yùn)算、使用、各種類型的指針、指針數(shù)組、類型表達(dá)式與復(fù)雜類型聲明,還討論了與動態(tài)存儲分配的相關(guān)操作。內(nèi)容摘要2重點(diǎn)講解8.1指針的概念與指針的使用8.2

指針運(yùn)算

8.3指針作為函數(shù)的參數(shù)8.4數(shù)組的指針表示8.5指針數(shù)組8.6

帶參數(shù)的main函數(shù)8.7

指針函數(shù)8.8函數(shù)的指針8.9指向數(shù)組的指針(見教材第11章)8.10用typedef定義類型表達(dá)式8.11復(fù)雜說明的解釋8.12復(fù)雜說明的應(yīng)用小結(jié)38.1.1

指針概念目錄8.1指針的概念與指針的使用

在計(jì)算機(jī)高級語言中,存儲數(shù)據(jù)的內(nèi)存單元稱為變量,并使用變量名引用之。變量的占用內(nèi)存的大小和存儲數(shù)據(jù)的格式,是由數(shù)據(jù)類型確定的。

內(nèi)存單元之地址稱為指針,存儲指針的內(nèi)存單元稱為指針變量。intx;floaty;charz;xyz&x&y&zintx;xp&x指針變量如何聲明???int型地址float型地址char型地址4

在指針變量說明語句的一般形式如下:數(shù)據(jù)類型*標(biāo)識符1[=初值1][,*標(biāo)識符2[=初值2],…,*標(biāo)識符n[=初值n]];其中,*為指針類型符;數(shù)據(jù)類型為指針?biāo)复鎯卧愋?,亦稱為指針類型,標(biāo)識符i為指針變量名;初值i為指針類型表達(dá)式。int*float*char*8.1.2

指針的聲明C語言提供指針數(shù)據(jù)類型,*為指針類型符,用于聲明存儲指針的內(nèi)存單元即指針變量。intfloatcharintx;xp&xint*p=&x;int型地址float型地址char型地址5

根據(jù)指向變量之?dāng)?shù)據(jù)類型,指針類型可劃分為不同數(shù)據(jù)類型。char

*int*float*double*longdouble*signedchar*unsignedchar*signedint*unsignedint

*signedlongint*signedshortint*signedint*unsignedlongint*unsignedshortint*unsignedint*整型類型指針浮點(diǎn)類型指針字符類型指針void*6例8.3

解釋以下復(fù)雜聲明的含義。(1)int(*p1)[3];p1是指向3個元素的整型數(shù)組的指針。(2)double*p2[5];p2是指針數(shù)組。(3)char(*fp)(int,int)fp是一個函數(shù)指針,所指向的函數(shù)有2個整型形參,返回類型char。(4)int*pf(float)pf是指針函數(shù)。(5)int(*fp_ary[2])(char*,char*)fp_ary是一個函數(shù)指針數(shù)組,該數(shù)組的每一個下標(biāo)變量都是函數(shù)指針。78.1.3

指針的使用C語言提供單目運(yùn)算*為指針指向的內(nèi)存單元即變量之引用,提供表達(dá)方式。單目*運(yùn)算的一般形式是:*右操作數(shù)其中,右操作數(shù)為指針表達(dá)式,運(yùn)算結(jié)果為右操作數(shù)--指針?biāo)竷?nèi)存單元即變量之名稱。intx;xp&xint*p=&x;*P變量x之“別名”x=1;x=x+1;x++;*p=1;*p=*p+1;(*p)++;8大家學(xué)習(xí)辛苦了,還是要堅(jiān)持繼續(xù)保持安靜9intx,*p=&x;8.2指針運(yùn)算目錄8.2.1

指針的算術(shù)運(yùn)算

指針類型的算術(shù)運(yùn)算限于加法+和和減法-,因?yàn)槠渌阈g(shù)運(yùn)算無意義。指針運(yùn)算的一般形式是:⑴表達(dá)式1±表達(dá)式2

或⑵表達(dá)式1-表達(dá)式3其中,表達(dá)式1為指針表達(dá)式;表達(dá)式2為整整表達(dá)式(≥0);表達(dá)式3為整型或指針表達(dá)式(≥0)

;⑴式為指針類型,值為表達(dá)式1±表達(dá)式2×sizeof(表達(dá)式1);⑵式為整型類型,值為(表達(dá)式1-表達(dá)式3)÷sizeof(表達(dá)式1)

。xp&x<512>*p……p

-1值:<510>p

+1值:<514>*(p-1)*(p+1)(p+1)-(p-1)值:2108.2.2

指針的賦值運(yùn)算和關(guān)系運(yùn)算

指針賦值的一般形式是:表達(dá)式1=表達(dá)式2其中,表達(dá)式1為左值表達(dá)式;表達(dá)式2為指針表達(dá)式,運(yùn)算結(jié)果值和類型與表達(dá)式1一致

。inta[8]={1,2,3,4,5,6,7,8},*p=&a[0],*q;paqq=p+3*p*q

指針類型可以進(jìn)行<、<=、>、>=、==和!=關(guān)系運(yùn)算,運(yùn)算結(jié)果為邏輯類型。11

不同基本類型指針之間的賦值運(yùn)算,必須使用類型強(qiáng)制。利用指針的賦值運(yùn)算以及類型強(qiáng)制可以實(shí)現(xiàn)一些特殊操作。#include"stdio.h"voidmain(void){longx=0x1234ABCD,k;char*p=(char*)&x;/*類型強(qiáng)制,p為字符指針*/charup_half,low_half;/*up_half存高4位,low_half存低4位*/for(k=0;k<4;k++){low_half=(*p)&0x0f;/*取低4位*/if(low_half<10)low_half|=’0’;/*低4位轉(zhuǎn)換成ASCII碼’0’-’9’*/elselow_half=(low_half-10)+’A’;/*低4位轉(zhuǎn)換成ASCII碼’A’-’F’*/up_half=(*p>>4)&0x0f;/*取高4位*/if(up_half<10)up_half|='0';/*高4位轉(zhuǎn)換成ASCII碼'0'-'9'*/elseup_half=(up_half-10)+'A';/*高4位轉(zhuǎn)換成ASCII碼'A'-'F'*/p++;/*指向整型數(shù)x下一個字節(jié)*/printf("%c%c",up_half,low_half);}}

例8.11試從占

4個字節(jié)的長整型數(shù)之低字節(jié)開始,依次取出其每個字節(jié)的高

4

位和低

4

位并以ASCII碼的形式進(jìn)行顯示。CDAB3412_128.3指針作為函數(shù)的參數(shù)目錄

指針作為函數(shù)的參數(shù)是指數(shù)據(jù)類型為指針的函數(shù)參數(shù),稱為指針參數(shù)。指針參數(shù)作用是實(shí)現(xiàn)子程序之間數(shù)據(jù)的雙向交換。8.3.1

形參指針對實(shí)參的影響

例8.12被調(diào)用函數(shù)中對形參的修改無法影響調(diào)用函數(shù)中實(shí)參變量的值舉例。#include"stdio.h"voidsu,intv);voidmain(void){intx,y;printf("inputtwointegersforxandyplease!\n");scanf("%d%d",&x,&y);printf("infunctionmain,beforesandy=%d\n",x,y);s);printf("infunctionmain,aftersandy=%d\n",x,y);}voidsu,intv){intt;printf("infunctionswap,beforesandv=%d\n",u,v);t=u;u=v;v=t;printf("infunctionswap,aftersandv=%d\n",u,v);}13main#include"stdio.h"voidsu,intv);voidmain(void){intx,y;printf("inputtwointegersforxandyplease!\n");scanf("%d%d",&x,&y);printf("infunctionmain,beforesandy=%d\n",x,y);swap(x,y);printf("infunctionmain,aftersandy=%d\n",x,y);}voidswap(intu,int

v){intt;printf("infunctionswap,beforesandv=%d\n",u,v);t=u;u=v;v=t;printf("infunctionswap,aftersandv=%d\n",u,v);}xyswapuvt1020↙1020

…x=10andy=201020

…u=10andv=20201010

…u=20andv=20

…x=10andy=2014main#include"stdio.h"voids*u,int*v);voidmain(void){intx,y;printf("inputtwointegersforxandyplease!\n");scanf("%d%d",&x,&y);printf("infunctionmain,beforesandy=%d\n",x,y);swap(&x,&y);printf("infunctionmain,aftersandy=%d\n",x,y);}voidswap(int*u,int*v){intt;printf("infunctionswap,beforespandv=%p\n",u,v);t=*u;*u=*v;*v=t;printf("infunctionswap,afterspandv=%d\p",u,v);}xyswapuvt10201020↙

…x=10andy=20

…u=…andv=…201010

…u=…andv=…

…x=20andy=10158.3.2

指針作為參數(shù)的應(yīng)用

例8.14將鍵盤輸入的所有數(shù)字串逐個的轉(zhuǎn)換為整數(shù),并且依次存放于一個數(shù)組中。數(shù)字串前面可以加+、-號,各數(shù)字串之間至少用一個空格分開,用回車結(jié)束輸入。#include"stdio.h"#include"ctype.h"#defineNUMBER100intgetint(int*pn){intc,sign;while(isspace(c=getchar()));/*跳過前導(dǎo)空格*/if(!isdigit(c)&&c!=EOF&&c!=ˊ+ˊ&&c!=ˊ-ˊ){printf("inputerror!\n");return0;}

/*若輸入為非數(shù)字、非EOF、也不是+、-號,顯示出錯*/sign=(c==ˊ-ˊ)?-1:1;/*處理符號*/if(c=='+'||c=='-')c=getchar();/*跳過+、-號*/for(*pn=0;isdigit(c);c=getchar())*pn=10**pn+(c-ˊ0ˊ);/*將數(shù)字串轉(zhuǎn)換為對應(yīng)整數(shù)*/*pn*=sign;/*處理整數(shù)的符號*/returnc;}voidmain(void){inta[NUMBER],i,j,k;printf("inputintegersendswithEnter\n");for(i=0;i<NUMBER&&(k=getint(&a[i]))!=ˊ\nˊ;)if(k)i++;for(j=0;j<=i;j++)

printf("%8d",a[j]);printf("\n");}168.4數(shù)組的指針表示8.4.1

一維數(shù)組的指針表示目錄inta[6],*p=a;/*或=&a[0]*/ap*(++p)=0;0

數(shù)組名是常量地址,其類型是數(shù)組元素類型指針。17pc=s 對字符指針變量pc賦值,使其指向字符數(shù)組s(即s[0])pc+i 結(jié)果為pc后面第i個元素的地址*(pc+i)結(jié)果為pc后面第i個元素*++pc 結(jié)果為pc加1之后所指元素++*pc 結(jié)果為pc所指元素加1*pc++ 結(jié)果為pc所指元素,然后pc加1(*pc)++

結(jié)果為pc所指元素,然后pc所指元素加1&pc 結(jié)果為字符指針變量pc的地址,類型為char**chars[6]={0,1,2,3,4,5},*pc;inti=2;spc運(yùn)算符表23

特別提示:注意運(yùn)算符的優(yōu)先級和結(jié)合性!18chars[6]={0,1,2,3,4,5},*pc=&s[1];inti=2;spc運(yùn)算符表s+i 結(jié)果為數(shù)組s中第i個元素的地址(即s[i]的地址)*(s+i)

結(jié)果為數(shù)組s中第i個元素s[i]++*s 結(jié)果為元素s[0]加1(*s)++

結(jié)果為元素s[0]的值,然后s[0]加1

特別提示:注意運(yùn)算符的優(yōu)先級和結(jié)合性!12s=pc 非法。數(shù)組名s是地址常量,不能進(jìn)行賦值操作&s非法。數(shù)組名s是地址常量,不能取地址*++s 非法。不能對數(shù)組名s進(jìn)行前綴++操作*s++非法。不能對數(shù)組名s進(jìn)行后綴++操作××?××&s類型為char(*)[6]198.4.2

一維數(shù)組參數(shù)的指針表示

對于函數(shù)形如intf(inta[],…){…}的形參a,其類型int[]實(shí)質(zhì)上是整型指針,即:int*。S1=15intfun(intx[],intn){inti,sum=0;for(i=0;i<n;i++)s+=x[i];return(s);}voidmain(void){inty[]={1,2,3,4,5};printf(”s1=%d\n”,fun(y,5));

printf(”s2=%d\n”,fun(&y[2],3));}main:yfun:xint型地址單元S2=12int*x20

例8.15用指針變量表示一維數(shù)組參數(shù),計(jì)算兩個向量的數(shù)量積。

#include"stdio.h"#defineSIZE3doublescalar(double*a,double*b,intn);voidmain(void){doublex[SIZE],y[SIZE],*px,*py;for(px=x;px<x+SIZE;px++)scanf("%lf",px);getchar();for(py=y;py<&y[SIZE];)scanf("%lf",py++);px=x;py=y;printf("thescalarofvectorxandvectoryis%lf\n",scalar(px,py,SIZE));printf(");}doublescalar(double*a,double*b,intn){doubles,*p;printf("thevectorais\n");for(p=a;p<a+n;)printf("%lf\t",*p++);printf("\nthevectorbis\n");for(p=b;p<b+n;)printf("%lf\t",*p++);printf("\n");for(s=0,p=a;p<a+n;)s+=((*p++)*(*b++));returns;}218.4.3

用指向數(shù)組基本元素的指針表示多維數(shù)組

inta[4][2],*p=a[0];/*或=&a[0][0]*/ap*(p+0*2+0)*(p+0*2+1)*(p+1*2+0)*(p+1*2+1)*(p+2*2+0)*(p+2*2+1)*(p+3*2+0)*(p+3*2+1)inta[M][N],*p=a[0];/*或=&a[0][0]*/app+i*N+j在a[i][j]之前int單元個數(shù)*(p+i*N+j)a[0]a[1]a[2]a[3]什么類型的指針??上機(jī)操作演示9-4-3.c22

例8.16用指向數(shù)組基本元素的指針變量實(shí)現(xiàn)三維數(shù)組元素的輸入和輸出。#include"stdio.h"#defineI2#defineJ3#defineK4voidmain(void){intv[I][J][K],*p=&v[0][0][0],n=1,i,j,k;for(i=0;i<I;i++)for(j=0;j<J;j++)for(k=0;k<K;k++)*(p+i*J*K+j*K+k)=n++;for(i=0;i<I;i++){for(j=0;j<J;j++){for(k=0;k<K;k++)printf("%4d",*(v[i][j]+k));printf("\n");}printf("\n");}}238.5指針數(shù)組8.5.1

指針數(shù)組的聲明及使用

數(shù)組元素為指針類型的數(shù)組,稱為指針數(shù)組。目錄

int*p[3];p是有3個元素的整型指針數(shù)組(int*[3])。說明的順序是:p

[3]

*

intp

char*pstr[]={”123”,”5678”};pstr是有2個元素的字符指針數(shù)組(char*[2])。pstr24

constintx=1,y=2;constint*ps[2];ps[0]=&x;ps[1]=&y;xyps

x和y變量是常量整型(constint),即

x

y

是必須賦初值、且不得改變的變量,也稱為符號常量。

ps是有2個數(shù)組元素的常量整型指針數(shù)組(const

int*[2])。

char*constpstr[]={”123”,”5678”};pstr

值不得改變!

const

char*constpstr[]={”123”,”5678”};pstr

值不得改變!25

例8.18理解指針數(shù)組含義的編程舉例。#include"stdio.h"voidmain(void){intx=1,y=2,z=3,i;int*p[3];p[0]=&x;p[1]=&y;p[2]=&z;printf("&x=%p\tx=%d\n",&x,x);printf("&y=%p\ty=%d\n",&y,y);printf("&z=%p\tz=%d\n",&z,z);for(i=0;i<3;i++){printf("&p[%d]=%p\t",i,&p[i]);printf("p[%d]=%p\t“,i,p[i]);printf("*p[%d]=%d\n",i,*p[i]);}}pzyx&x=FFD0x=1&y=FFD2y=2&z=FFD4z=3&p[0]=FFD6p[0]=FFD0*p[0]=1&p[1]=FFD8p[1]=FFD2*p[1]=2&p[2]=FFDAp[2]=FFD4*p[2]=326

對指針數(shù)組中元素可以進(jìn)行同類型指針允許的全部操作。

inta[]={1,2,3},b[]={4,5,6},*p[2];p[0]=a;/*對指針數(shù)組中的元素p[0]賦值,使之指向a數(shù)組*/p[1]=b;/*對指針數(shù)組中的元素p[1]賦值,使之指向b數(shù)組*/*p[0]=12;/*使a[0]=12*/++*p[1];/*間訪b[0]并使其自增,結(jié)果為5,p[1]仍然指向b[0]*/*p[1]++;/*間訪b[0],然后p[1]自增,使p[1]指向b[1]*/apb125運(yùn)算符表27

例8.19

未賦值指針數(shù)組引起的副作用舉例。#include"stdio.h"#defineN6voidmain(void){inti,*p[N],sum=0;for(i=0;i<N;i++){scanf("%d",p[i]);sum+=*p[i];}for(i=0;i<N;i++)printf("p[%d]=%p,result=%d\n",i,p[i],*p[i]);

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

p[0]=0000,result=4p[1]=FFDC,result=2p[2]=0580,result=3p[3]=0000,result=4p[4]=0040,result=5p[5]=0C39,result=6sum=21Nullpointerassignment28

例8.20解決未賦值指針數(shù)組引起的副作用舉例。#include"stdio.h"#defineN6voidmain(void){

inti,a[N],*p[N],sum=0;

for(i=0;i<N;i++){p[i]=&a[i];scanf("%d",p[i]);sum+=*p[i];}for(i=0;i<N;i++)printf("p[%d]=%p,result=%d\n",i,p[i],*p[i]);

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

p[0]=FFCA,result=1p[1]=FFCC,result=2p[2]=FFCE,result=3p[3]=FFD0,result=4p[4]=FFD2,result=5p[5]=FFD4,result=6sum=2112345629#include"stdio.h"voidmain(void){intx0[5],x1[5],x2[5],x3[5],x4[5];int*p[5];inti,j;p[0]=x0;p[1]=x1;p[2]=x2,p[3]=x3,p[4]=x4;for(i=0;i<5;i++)for(j=0;j<5;j++)if(i==j)p[i][j]=1;elsep[i][j]=0;for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%4d",p[i][j]);printf("\n");}}

例8.21用指針數(shù)組表示二維整型數(shù)組。px1x2x3x4x530

例8.22用字符指針數(shù)組表示出錯提示字符串?dāng)?shù)組。#include"stdio.h"voiderror_prompt(interr_code);voidmain(void){intn;while(1){scanf("%d",&n);if(n==-1)break;error_prompt(n);}}voiderror_prompt(interr_code){char*perror[]={"can'topenfile!","readerror!","writeerror!","illegalaccessexception!"};printf("errorcode:%d:%s\n",err_code,perror[err_code]);}can'topenfile!\0perror1↙

Readerror!

-1↙

illegalaccessexception!\0readerror!\0writeerror!\0318.6帶參數(shù)的main函數(shù)

目錄8.6.1

命令行參數(shù)

命令行參數(shù)(command-linearguments)指在操作系統(tǒng)環(huán)境下執(zhí)行一個可執(zhí)行程序時(shí)為其所提供的實(shí)際參數(shù)。c:\>copyabc.txtdef.txt

在DOS下執(zhí)行copy命令,將一個文件abc.txt的內(nèi)容拷貝到另外一個文件def.txt。

C語言編制的可執(zhí)行程序,對于命令行提供的實(shí)際參數(shù),將由C程序之main函數(shù)定義的形式參數(shù)接受。即對于C語言,命令行參數(shù)就是main函數(shù)的參數(shù)。

在DOS下,命令行一般格式如下,文件名和參數(shù)以及參數(shù)和參數(shù)之間是空格符間隔??蓤?zhí)行文件名參數(shù)1

參數(shù)2

參數(shù)n328.6.2

帶參main函數(shù)的聲明及使用

聲明具有命令行參數(shù)的main函數(shù)的一般形式是:類型main(intargc,char*argv[]){…//函數(shù)體

}其中,類型為main的函數(shù)類型;argc值表示命令行中字符串的個數(shù);argv的每個字符指針元素指向一個命令行中的字符串。c:\>程序名參數(shù)1

參數(shù)2

參數(shù)nargcargv程序名\0…參數(shù)1\0參數(shù)2\0參數(shù)n\033#include"stdio.h"intmain(intargc,char*argv[]){intn=0;while(n<argc){printf(“%s”,argv[n]);

(n<argc-1)?printf(""):printf(“\n”);

n++;}printf("thenumberofcommand-lineargumentsare%d\n",argc);return0;}

例8.25回顯命令行參數(shù)并顯示命令行參數(shù)個數(shù)的程序?qū)嵗rgcargvC:\>showIlikeCprogramming.↙\\\\\C:\>showIlikeCprogramming.C:\>thenumberofcommand-lineargumentsare534

例8.27用其它自定義名字表示main函數(shù)命令行形參的例子。

#include"stdio.h"intmain(intnum,char*v[]){

intn=0;while(n<num){printf("&v[%d]=%p\t",n,&v[n]);printf("&v[%d][0]=%p\t",n,v[n]);printf("v[%d]=%s\n",n,v[n]);

n++;}return0;}

程序中分別用整型形參num,和形參字符指針數(shù)組v來表示main函數(shù)的命令行參數(shù)。35

定義指針函數(shù)的一般形式是:類型*函數(shù)名(形參表){

…//函數(shù)體

};其中,函數(shù)名之函數(shù)類型為類型*;類型為任意數(shù)據(jù)類型。

聲明指針函數(shù)的一般形式是:類型*函數(shù)名(形參表);其中,函數(shù)名之函數(shù)類型為類型*;類型為任意數(shù)據(jù)類型。8.7指針函數(shù)

8.7.1

指針函數(shù)的聲明與定義

一個函數(shù)返回值為指針類型之函數(shù),稱為指針函數(shù)。目錄

除了返回類型之外,指針函數(shù)與其它類型函數(shù)之特性一樣。char*strcpy(char*t,char*s){char*p=t;while(*s++=*t++);returnp;}36#include"stdio.h"char*strstr(char*s,char*t){char*ps=s,*pt,*pc;while(*ps!=’\0’){for(pt=t,pc=ps;*pt!=’\0’&&*pt==*pc;pt++,pc++);if(*pt==’\0’)returnps;ps++;}return0;}voidmain(void){chars1[]="abcdefghijk12",s2[]="fgh",*p;p=strstr(s1,s2);printf("%p\t%s\n",&s1[0],s1);printf("%p\t%s\n",p,p);}8.7.2

指針函數(shù)的使用

例8.28

查找子串的指針函數(shù)應(yīng)用舉例。s1s2stpspt\\pFFCCabcdefghijkFFD1fghijk12pc37

聲明函數(shù)指針的一般形式是:類型(*函數(shù)指針名)(形參表);其中,函數(shù)指針名是指針變量名,所指函數(shù)的類型為類型(形參表);類型為指向的函數(shù)類型;參數(shù)表是指向的函數(shù)形參表。8.8函數(shù)的指針

8.8.1

函數(shù)指針的聲明

如果一個指針存放的是函數(shù)的入口地址,則該指針稱為函數(shù)指針。函數(shù)指針變量函數(shù)

所指函數(shù)的類型和參數(shù),必須與指針對象類型即類型(形參表)一致!目錄38

函數(shù)指針賦值的一般形式是:函數(shù)指針名=函數(shù)名;其中,函數(shù)名是已經(jīng)定義的函數(shù)之名稱,其類型應(yīng)與函數(shù)指針名所指函數(shù)類型即類型(形參表)一致。

通過函數(shù)指針調(diào)用所指函數(shù)的一般形式是:(*函數(shù)指針名)(實(shí)參表)

或函數(shù)指針名(實(shí)參表)其中,實(shí)參表的參數(shù)個數(shù)與類型,應(yīng)與函數(shù)指針名所指函數(shù)的形參表一致。函數(shù)名是地址常量,其值為函數(shù)之入口地址。39

例8.29

函數(shù)指針的應(yīng)用舉例。#include"stdio.h"voidf1(intx){printf("functionf1iscalled!\n");

printf("x=%d\n",x);}voidf2(intx,inty){printf("functionf2iscalled!\n");printf("x=%d\ty=%d\n",x,y);}voidmain(void){void(*pf1)(intx);void(*pf2)(intx,inty);pf1=f1;pf2=f2;pf1(5);pf2(10,20);(*pf1)(50);(*pf2)(100,200);}pf1pf2functionf1iscalled!x=5functionf2iscalled!x=10y=20functionf1iscalled!x=50functionf2iscalled!x=100y=200408.8.2

函數(shù)指針的應(yīng)用

例8.30讀取從鍵盤輸入正文,再將正文以行為單位排序后輸出。通過命令行參數(shù)-n決定排序方法。如果有命令行參數(shù)-n,則將輸入行按照數(shù)值大小進(jìn)行排序;否則將按照字典順序排序。

mainreadlineswritelinessortnumcmpstrcmpgetlineswapvoidsort(void*v[],intn,int(*comp)(void*,void*)){inti,j;voids*v[],int,int);for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++) if((*comp)(v[j],v[j+1])>0)s);}418.9指向數(shù)組的指針(教材第11章內(nèi)容)

8.9.1

指向數(shù)組指針的聲明與定義

一個指針類型為數(shù)組的指針,稱為數(shù)組指針。目錄

聲明指針函數(shù)的一般形式是:類型(*指針名)[M1][M2]…[Mn];其中,指針名指向的數(shù)組之類型為類型[M1][M2]…[Mn]。

intu[2][3],*p=&u[0][0],(*p1)[3]=u;

upp1p數(shù)據(jù)類型為int*,其指向的存儲單元之?dāng)?shù)據(jù)類型為int。p1數(shù)據(jù)類型為int(*)[3],其指向的存儲單元之?dāng)?shù)據(jù)類型為int[3]。

數(shù)組名是常量地址,其類型是數(shù)組元素類型指針。u地址類型為:int(*)[3]428.9.2

用數(shù)組名間訪多維數(shù)組的元素

一個n維數(shù)組是其數(shù)組元素為n-1維數(shù)組的一維數(shù)組。intA[M1][M2][M3]…[Mn];數(shù)組A是類型為[M1]一維數(shù)組,其元素是類型為int[M2][M3]…[Mn]的n-1維數(shù)組。

A是一個指向其數(shù)組元素——n-1維整型數(shù)組之常量指針,其值為n維數(shù)組之首地址。*A是A所指向n-1維整型數(shù)組。

int

a[3][2];aint(*)[2]int*int43

假設(shè)i,j,k,…,m,n皆未使數(shù)組下標(biāo)越界,用數(shù)組名,數(shù)組名和下標(biāo)操作符等非左值常量指針表示多維數(shù)組的元素形式是:

⑴對于二維整型數(shù)組u,其u[i][j]元的地址用指向數(shù)組元素的指針表示為:u[i]+j

用指向一維數(shù)組(下一級數(shù)組)的指針表示則為:*(u+i)+j

用間訪形式訪問其u[i][j]元可以表示為:*(u[i]+j)和*(*(u+i)+j)

int

a[3][2];aa[2]+1*(a+2)+1*(a[2]+1)*(*(a+2)+1)44

一個n維數(shù)組是其數(shù)組元素為n-1維數(shù)組的一維數(shù)組。intA[M1][M2][M3]…[Mn];A是一個類型為:int(*)[M2][M3]…[Mn];的數(shù)組的指針。

一般情況:一個n維數(shù)組的名字(或別名)是對應(yīng)n-1維數(shù)組的指針。

*(A+i)是一個n-1維數(shù)組的別名,為對應(yīng)n-2維數(shù)組的指針。類型為:

int(*)[M3]…[Mn];等價(jià)形式為A[i]

*(*(A+i)+j)是一個n-2維數(shù)組的別名,為對應(yīng)n-3維數(shù)組的指針。類型為:

int(*)[M4]…[Mn];等價(jià)形式為A[i][j]可以理解0位數(shù)組的指針就是對應(yīng)數(shù)據(jù)類型的指針(如int*)45

假設(shè)i,j,k,…,m,n皆未使數(shù)組下標(biāo)越界,用數(shù)組名,數(shù)組名和下標(biāo)操作符等非左值常量指針表示多維數(shù)組的元素形式是:⑵對于三維整型數(shù)組v,其v[i][j][k]元的地址用指向數(shù)組元素的指針v[i][j]表示為:v[i][j]+k

用指向一維數(shù)組的指針v[i]表示為:*(v[i]+j)+k

用指向二維數(shù)組(下一級數(shù)組)的指針v表示為:*(*(v+i)+j)+k

用間訪形式訪問其v[i][j][k]元可以表示為:*(v[i][j]+k),*(*(v[i]+j)+k),*(*(*(v+i)+j)+k)46

例11.2用數(shù)組名常量指針實(shí)現(xiàn)二維數(shù)組元素的輸入和輸出。#include"stdio.h"#defineN2#defineM3voidmain(void){

intu[N][M];intj;

/*用指向數(shù)組元素的指針完成第0行元素的輸入*/for(j=0;j<M;j++)scanf("%d",u[0]+j);/*用指向下一級數(shù)組的指針完成第1行元素的輸入*/for(j=0;j<M;j++)scanf("%d",*(u+1)+j);

/*用指向下一級數(shù)組的指針完成第0行元素的輸出*/for(j=0;j<M;j++)printf("%6d",*(*(u+0)+j));printf("\n");

/*用指向數(shù)組元素的指針完成第1行元素的輸出*/for(j=0;j<M;j++)printf("%6d",*(u[1]+j));printf("\n");}478.9.4

多維數(shù)組參數(shù)的指針表示1.形參為指向數(shù)組元素的指針

形參說明為指向數(shù)組元素的指針時(shí),實(shí)參應(yīng)為數(shù)組元素的地址,或?yàn)橹赶驍?shù)組元素的指針變量。voidfun(int*p,intn);/*形參說明為指向數(shù)組元素的指針*/voidmain(void){intu[2][3],v[2][3][4];

…fun(u[0],2*3);/*實(shí)參u[0]是元素u[0][0]的地址*/

…fun(v[0][0],2*3*4);/*實(shí)參v[0][0]是元素v[0][0][0]的地址*/

…}488.9.4

多維數(shù)組參數(shù)的指針表示2.形參為指向下一級數(shù)組的指針

形參說明為指向下一級數(shù)組的指針時(shí),實(shí)參應(yīng)為數(shù)組名或指向下一級數(shù)組的指針。

voidf1(int(*p1)[3],intn);/*指向一維數(shù)組的指針p1為形參*/voidf2(int(*p2)[3][4],intn);/*指向二維數(shù)組的指針p2為形參*/voidmain(void){intu[2][3],v[2][3][4];

…f1(u,2*3);/*數(shù)組名u作為實(shí)參*/

…f2(v,2*3*4);/*數(shù)組名v作為實(shí)參*/

…}498.10用typedef定義類型

8.10.1

類型表達(dá)式

C中另外一類表達(dá)式

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論