版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年幼兒園幼兒保教質(zhì)量提升合同3篇
- 二零二五場(chǎng)部關(guān)鍵崗位保密責(zé)任書2篇
- 2025年度金融理財(cái)產(chǎn)品經(jīng)銷商合同之分銷商專項(xiàng)協(xié)議
- 2025年度知識(shí)產(chǎn)權(quán)法律咨詢與知識(shí)產(chǎn)權(quán)侵權(quán)應(yīng)對(duì)顧問服務(wù)合同
- 2025年度駕校合伙經(jīng)營協(xié)議書-駕校學(xué)員投訴處理與滿意度調(diào)查協(xié)議
- 2025年度快遞物流企業(yè)加盟合作協(xié)議范本
- 2025年度鮮魚養(yǎng)殖行業(yè)人才培訓(xùn)與招聘合同
- 2025年度企業(yè)團(tuán)餐定制服務(wù)合同書
- 二零二五年度知識(shí)產(chǎn)權(quán)保護(hù)教育與培訓(xùn)服務(wù)合同
- 二零二五年度公共場(chǎng)合禮儀規(guī)范與執(zhí)行合同
- 普通高中生物新課程標(biāo)準(zhǔn)
- 茉莉花-附指法鋼琴譜五線譜
- 結(jié)婚函調(diào)報(bào)告表
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計(jì)規(guī)范-PDF解密
- 冷庫制冷負(fù)荷計(jì)算表
- 肩袖損傷護(hù)理查房
- 設(shè)備運(yùn)維管理安全規(guī)范標(biāo)準(zhǔn)
- 辦文辦會(huì)辦事實(shí)務(wù)課件
- 大學(xué)宿舍人際關(guān)系
- 2023光明小升初(語文)試卷
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
評(píng)論
0/150
提交評(píng)論