清華大學(xué)C++課程第11講指針(下)_第1頁
清華大學(xué)C++課程第11講指針(下)_第2頁
清華大學(xué)C++課程第11講指針(下)_第3頁
清華大學(xué)C++課程第11講指針(下)_第4頁
清華大學(xué)C++課程第11講指針(下)_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

清華大學(xué)C++課程第11講指針(下)§11.1二維數(shù)組的指針二維數(shù)組的指針類型a代表整個(gè)二維數(shù)組的首地址a也是第1行的地址,a+i表示第i行元素的首地址,a+i=&a[i]&a[0][0]代表第一個(gè)元素的首地址,a[i][j]是第i行、j列元素地址staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};§11.1二維數(shù)組的指針行首址如果將a看作由a[0]、a[1]、a[2]組成的一維數(shù)組,則有a+i=&a[i],a[i]=*(a+i);a[i]看作a[i][0],a[i][1],a[i][2]組成的一維數(shù)組,則有a[i]=&a[i][0];§11.1二維數(shù)組的指針元素地址的表示

根據(jù)一維數(shù)組的表示方法,有:

(1)a[i]=&a[i][0];a[0]+i:表示一維數(shù)組中第i個(gè)元素地址,即:a[0]+1=&a[0][1];a[0]+2=&a[0][2];a[1]+1=&a[1][1];a[i]+j=&a[i][j]。

(2)&a[i][j]=*(a+i)+j;(3)a[i][j]=*(a[i]+j)=*(*(a+i)+j)§11.1二維數(shù)組的指針已知二維數(shù)組的元素指針后,可以用*運(yùn)算符訪問該元素。例:a[1][2]=13*(a[1]+2)=13*(*(a+1)+2)=13

以上是否有區(qū)別?§11.1二維數(shù)組的指針變量指向元素的指針變量:指向數(shù)組元素的指針變量和一般普通指針變量相同;提問:比較直接用二維數(shù)組下標(biāo)訪問元素有什么不同?§11.1二維數(shù)組的指針變量main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",a[i][j]);printf("\n");}}§11.1二維數(shù)組的指針變量上例中p=a[0]改為p=a;行么?a[0]+12和a+12區(qū)別?§11.1二維數(shù)組的指針變量指向數(shù)組行的指針變量:用來指向數(shù)組的每一行;定義形式: 類型標(biāo)示符(*變量名)[列長]例如:inta[4][3];int(*p)[3];

p=a;

提問:p+2表示是什么意義?而*(*(p+i)+j)表示是什么意義?【例】用指向數(shù)組的行指針變量輸出二維數(shù)組的任意一個(gè)元素§11.1二維數(shù)組的指針變量§11.2字符串指針變量字符串的存儲(chǔ)形式有兩種方式存儲(chǔ)字符串:字符數(shù)組、字符指針變量main(){char*string="IloveChina!";

printf("%s\n",string);}注意:char*string="IloveChina!";等價(jià)于

char*string;

string="IloveChina!";§11.2字符的指針變量[例]將字符串a(chǎn)復(fù)制到字符串b。(用指針處理)§11.2字符的指針變量

字符數(shù)組字符指針變量組成:由若干元素組成,每個(gè)元素放一個(gè)字符。存放字符串首地址。初值方式:staticcharstr[]={"IloveChina!"};char*a="IloveChina!";賦值方式:charstr[14];char*a;str=“IloveChina!”;(錯(cuò)誤)a="IloveChina!";占用內(nèi)存:字符數(shù)組一個(gè)元素占一字節(jié)內(nèi)存,且在編譯時(shí)分配。

而指針變量中只可以放一個(gè)地址值(近指針=2字節(jié),遠(yuǎn)指針=4字節(jié))。且編譯時(shí)未指定。

charstr[10];scanf("%s",str);

而:char*a;

scanf(“%s”,a);a尚未指向任何變量,因此編譯通不過。字符數(shù)組和字符指針的比較§11.3指針數(shù)組指針數(shù)組概念:指針數(shù)組是一個(gè)數(shù)組,該數(shù)組中的每一個(gè)元素是指針變量形式:類型標(biāo)識(shí)符*數(shù)組名[數(shù)組元素個(gè)數(shù)]例:int*p[4],*name[5];

定義一個(gè)指針數(shù)組,數(shù)組名p,有4個(gè)元素,每一個(gè)元素是指向整型變量的指針§11.3指針數(shù)組處理多個(gè)字符串:字符串本身是一維數(shù)組,多個(gè)字符串可以用二維數(shù)組來處理,但會(huì)浪費(fèi)許多內(nèi)存。用指針數(shù)組處理多個(gè)字符串,不會(huì)浪費(fèi)內(nèi)存。§11.3指針數(shù)組[例]將若干字符串按字母順序(由小到大)輸出?!?1.3指針數(shù)組§11.4指向指針變量的指針變量§11.4指向指針變量的指針變量定義舉例:

char**p;

p=name+2;§11.4指向指針變量的指針變量§11.5指向指針變量的指針變量main()函數(shù)的參數(shù)運(yùn)行程序的命令行中,可以包含參數(shù),例、命令名參數(shù)1參數(shù)2

.....參數(shù)n

例如,“命令名”是可執(zhí)行文件file1.exe,執(zhí)行該命令時(shí)包含兩個(gè)字符串參數(shù):

file1ChinaBeijing在源程序file1.c中,用main()函數(shù)的參數(shù)來表示命令的參數(shù),main(intargc,char*argv[])

其中,argc表示命令行參數(shù)的個(gè)數(shù)(包括命令名),指針數(shù)組argv用于存放參數(shù)(包括命令名)上例中:argc=3;argv[0]="file1.exe",argv[1]="China",argv[2]="Beijing"§11.5指向指針變量的指針變量§11.6函數(shù)指針一個(gè)函數(shù)在編譯時(shí)被分配一個(gè)入口地址(第一條指令的地址),這個(gè)入口地址稱為函數(shù)的指針。如果一個(gè)指針變量的值等于函數(shù)的入口地址,稱為指向函數(shù)的指針變量函數(shù)的指針變量:指向函數(shù)的入口地址的變量。用函數(shù)指針變量調(diào)用函數(shù)

C++語言中的指針變量,既可以指向變量(整型、字符型、實(shí)型、數(shù)組等),也可以指向程序的代碼(如函數(shù))可以通過函數(shù)指針變量來調(diào)用函數(shù)§11.6函數(shù)指針函數(shù)指針變量定義形式:函數(shù)返回值類型(*指針變量名)(形參類型)即:除函數(shù)名用(*指針變量名)代替外,函數(shù)指針的定義形式與函數(shù)的原型相同。(在函數(shù)指針定義中加入形參類型是現(xiàn)代程序設(shè)計(jì)風(fēng)格)。例:int(*p)(int,int);

僅當(dāng)形參類型是int時(shí),可以省略形參類型,一般不要省略。int(*p)();語句p=max,把函數(shù)max的入口地址賦給函數(shù)指針變量p,因此,c=(*p)(a,b)中,*p就是調(diào)用函數(shù)max§11.6函數(shù)指針注意:指向函數(shù)的指針變量p,象p++、p--、p+n等運(yùn)算是無意義的?!?1.6函數(shù)指針函數(shù)指針變量作函數(shù)的參數(shù):用函數(shù)指針作某函數(shù)的參數(shù)時(shí),可以實(shí)現(xiàn)將函數(shù)指針變量所指向的函數(shù)入口地址傳遞給該函數(shù),從而來實(shí)現(xiàn)統(tǒng)一的調(diào)用語句來調(diào)用不同的函數(shù)[例]設(shè)一個(gè)函數(shù)process,在調(diào)用它的時(shí)候,每次實(shí)現(xiàn)不同的功能。輸入a和b兩個(gè)數(shù),第一次調(diào)用時(shí)找出a和b中大者,第二次調(diào)用時(shí)找出a和b中小者,第三次調(diào)用時(shí)求a與b之和分析:將求大值、求小值、求和值分別設(shè)計(jì)為函數(shù)max、min、add。process使用指針調(diào)用這些函數(shù)§11.6函數(shù)指針intmax(intx,inty);/*求大值*/intmin(intx,inty);/*求小值*/intadd(intx,inty);/*求和值*/voidprocess(intx,inty,int(*fun)(int,int));voidmain()

{inta,b;

printf("enteraandb:");

scanf("%d,%d",&a,&b);

printf("max=");

process(a,b,max);

printf("min=");

process(a,b,min);

printf("sum=");

process(a,b,add);

}intmax(intx,inty)

{intz;

if(x>y)z=x;

elsez=y;

returnz;}intmin(intx,inty)

{intz;

if(x<y)z=x;elsez=y;

returnz;}intadd(intx,inty)

{intz;

z=x+y;

returnz;}voidprocess(intx,inty,int(*fun)(int,int))

{intresult;

result=(*fun)(x,y);

printf("%d\n",result);}§11.6函數(shù)指針[例]:求定積分分析:編寫一個(gè)求定積分的通用函數(shù):floatintegral(float(*fun)(float),floata,floatb);其中,a、b表示積分區(qū)間,fun是函數(shù)指針。§11.6函數(shù)指針函數(shù)f在區(qū)間[a,b]的定積分公式:§11.6函數(shù)指針floatf1(floatx){floatf;f=1+x*x;returnf;}floatf2(floatx){floatf;f=1+x+x*x+x*x*x;returnf;}floatf3(floatx){floatf;f=x/(1+x*x);returnf;}floatintegral(float(*fun)(float),floata,floatb){floats,h,y;intn,i;s=((*fun)(a)+(*fun)(b))/2.0;n=100;h=(b-a)/n;for(i=1;i<n;i++)s=s+(*fun)(a+i*h);y=s*h;returny;}

voidmain(){floaty1,y2,y3;y1=integral(f1,0.0,1.0);y2=integral(f2,0.0,2.0);y3=integral(f3,0.0,3.5);printf("y1=%6.2f\ny2=%6.2f\ny3=%6.2f\n",y1,y2,y3);}§11.7返回指針的函數(shù)前面介紹了return語句只能返回一個(gè)值,如何返回多個(gè)數(shù)據(jù)?通過返回指針來實(shí)現(xiàn)返回指針函數(shù)定義形式:類型標(biāo)識(shí)符*函數(shù)名(參數(shù)表)例、int*a(intx,inty);

聲明一個(gè)函數(shù),函數(shù)名為a,其返回值類型是“指向整型的指針”,函數(shù)形式參數(shù)為intx和inty例.有若干學(xué)生的成績(每個(gè)學(xué)生四門課程),要求用戶在輸入學(xué)生序號(hào)(從0開始)后,能輸出該學(xué)生的全部成績分析:設(shè)計(jì)一個(gè)指針變量pointer指向一個(gè)學(xué)生的四門成績,float(*pointer)[4];§11.7返回指針的函數(shù)float*search(float(*pointer)[4],intn);voidmain()

{staticfloatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};

float*p;

inti,m;

printf("enterthenumberofstudent:");

scanf("%d",&m);

printf("ThescoresofNo.%dare:\n",m);

p=search(score,m);for(i=0;i<4;i++)

printf("%5.2f\t",*(p+i));}float*search(float(*pointer)[4],intn){float*pt;/*pt是指向?qū)崝?shù)指針變量,pointer是指向數(shù)組指針*/

pt=*(pointer+n);/*pt=(float*)(pointer+n)*/

returnpt;}§11.8指針變量使用小結(jié)有關(guān)指針變量的類型

定義含義

inti;定義整型變量iint*p;p是指向整型數(shù)據(jù)的指針變量

inta[n];定義數(shù)組a,元素類型為int,元素個(gè)數(shù)是nint*p[n];p是指針數(shù)組,包含n個(gè)指針變量,每一個(gè)指針變量可以指向整型數(shù)據(jù)

int(*p)[n];p是指向數(shù)組的行指針,數(shù)組有n個(gè)整型數(shù)

intf();f是函數(shù),返回值是intint*p();p是函數(shù),返回值是指針,該指針指向整型數(shù)據(jù)

int(*p)();p是函數(shù)指針變量,可以指向返回int數(shù)據(jù)類型的函數(shù)的入口地址。

int**p;p是指針變量,指向一個(gè)指向整型數(shù)據(jù)的指針§11.8指針變量使用小結(jié)指針變量運(yùn)算小結(jié)1、指針變量加/減運(yùn)算p++、p--、p+i、p-i、p+=i、p-=i加1表示指向下一個(gè)數(shù)據(jù)。§11.8指針變量使用小結(jié)2、指針變量賦值

p=&a;變量a的地址賦給p,即指針p指向a

p=array;數(shù)組array首地址賦給p

p=&array[i];數(shù)組元素

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論