版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
數(shù)組的指針和指向數(shù)組的指針變量指向數(shù)組元素的指針變量的定義與賦值:(與指向變量的指針變量相同。)如:inta[10];(定義a為包含10個整型數(shù)據(jù)的數(shù)組)int*p;(定義p為指向整型變量的指針變量)p=&a[8];(p指向數(shù)組元素a[8])p=a;(p指向數(shù)組元素a[0],首地址)數(shù)組的指針和指向數(shù)組的指針變量C語言規(guī)定:數(shù)組名代表數(shù)組的首地址。p=&a[0];p=a;兩個語句等價在定義指針變量的同時可賦初值:int*p=&a[0];或int*p=a;每一句等價于:int*p;p=&a[0];兩句。圖9.12指向數(shù)組元素的指針變量p&a[0]13151719pa[0]:a[9]數(shù)組的指針和指向數(shù)組的指針變量通過指針引用數(shù)組元素假設p=&a[5];那么:a[5]=8;等價于*p=8;c規(guī)定:p=p+1:新p指向數(shù)組的下一元素。P=P+1:意味著新p比原p的地址值多d個字節(jié)〔d為一個數(shù)組元素所占的字節(jié)數(shù)〕。數(shù)組的指針和指向數(shù)組的指針變量如果開始p指向a[0](即p=&a[0]),那么:〔1〕p+i和a+i:均為a[i]的地址(&a[i])。〔2〕*(p+i)或*(a+i):均為a[i]的值(a[i])。〔3〕指向數(shù)組的指針變量也可以帶下標,如p[i]與*(p+i)等價:也均為a[i]。圖*(p+i)a數(shù)組a[0]a[1]a[2]a[i]a[9]pp+1,a+1p+i,a+ip+9,a+9數(shù)組的指針和指向數(shù)組的指針變量據(jù)上所述,引用一個數(shù)組元素有二法:〔1〕下標法:如a[i]形式;〔2〕指針法:如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組元素的指針變量,且其初值p=a。[例9.5]用三種方法輸出數(shù)組全部元素。(1)下標法main(){inta[10];inti;for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<10;i++)printf("%d",a[i]);}
(2)通過數(shù)組名計算數(shù)組元素地址,找出元素的值main(){inta[10];inti;for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<10;i++)printf("%d",*(a+i));}(3)用指針變量指向數(shù)組元素main(){inta[10];int*p,i;for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(p=a;p<(a+10);p++)printf("%d",*p);}數(shù)組的指針和指向數(shù)組的指針變量使用指針變量時,有幾個問題要注意:〔1〕P++合法;但a++不合法〔a是數(shù)組名,代表數(shù)組首地址,是常數(shù)地址?!场?〕要注意指針變量的當前值。
[例9.6]main(){int*p,i,a[10];p=a;for(i=0;i<10;i++)scanf("%d",p++);printf("\n");p=a;for(i=0;i<10;i++,p++)printf("%d",*p);}〔如果沒有p=a;第二個printf語句將出問題。)數(shù)組的指針和指向數(shù)組的指針變量〔3〕注意指針變量的有關運算:假設先使指針指向數(shù)組a,即有p=a,那么:p++(或p+=1〕:p將指向下一元素,即a[1]。*p++:等價于*〔p++),先*p,得a[0];P再自增1,新的p指向a[1]。*(p++)與*(++p):*(p++)是先取*P的值,后使P加1;*(++p)是先使p加1,后取*p的值。數(shù)組的指針和指向數(shù)組的指針變量(*p)++:表示p所指向的元素值加1(即a[0]++),而不是指針值p加1。如果p指向a數(shù)組的第i個元素,那么:*(p--)相當于a[i--],先取p值做*運算,再使p自減?!?/p>
數(shù)組的指針和指向數(shù)組的指針變量數(shù)組名作函數(shù)參數(shù)main()|f(b,n){inta[10];|intb[],n;a[0]=5;…...|{……..f(a,10);|b[0]==5(真)…...…...|b[n-1]==b[9](真)…...|……}|}數(shù)組的指針和指向數(shù)組的指針變量]“數(shù)組倒序〞算法示意圖:(a[i]值與a[j]值交換,0≤i≤m,m=(n-1)/2,)3791106754224576011973imj圖9.16[例9.7]源程序voidinv(x,n)intx[],n;{intt,i=0,j=n-1;m=(n-1)/2;for(;i<=m;i++,j--){t=x[i];x[i]=x[j];x[j]=t;}return;}(注:紅色代碼與書上的不同〕main(){staticinta[10]={0,1,2,3,4,5,6,7,8,9};inti;inv(a,10);printf(“數(shù)組已被反序為:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf(“\n〞);}結果:9,8,7,6,5,4,3,2,1,0數(shù)組的指針和指向數(shù)組的指針變量9.3.4指向多維數(shù)組的指針和指針變量一、多維數(shù)組的地址今以二維數(shù)組為例,設二維數(shù)組的數(shù)組名為a。兩種不同性質的地址值:行地址與元素地址a與*a、*(a+0)、a[0]:前者第0行首地址;后者第0行第0列元素的地址.a+i與*(a+i)、a[i]:前者第i行首地址;后者第i行第0列元素的地址.
2000120023200452006720089201011201213201415201617201819202021202223aa+1a+2a[0]+1a[0]+2a[0]+3圖9.25行地址,元素地址的表示法二維數(shù)組多種地址的表示形式:(圖9.25的對應表)表示形式含義地址
a二維數(shù)組第0行首地址2000a[0],*(a+0),*a第0行第0列元素地址2000a+1第1行首地址2008a[1],*(a+1)第1行第0列元素地址2008a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址2012*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素的值元素值為13二、多維數(shù)組的指針元素的指針變量定義:與指向普通變量的指針變量相同。p=p+1:新p將指向下一個數(shù)組元素。(即:這種指針變量p加1的移動量以數(shù)組的一個元素為單位〕由二維數(shù)組的首地址計算元素a[i][j]的地址:(設二維數(shù)組每行有m個元素,且p1=&a[0];)思路:〔1〕元素a[i][j]前面共有多少個元素?〔im+j〕個〔2〕元素a[i][j]的指針比a[0][0]的指針應加幾?所以:p2=p1+(im+j);即p2=&a[0][0]+im+j;a[2][3]i=2j=3mn圖(p1=&a[0][0],p2=&a[2][3]:p2=p1+im+j=p1+11)數(shù)組的指針和指向數(shù)組的指針變量定義:int(*p)[4];那么定義了p為指向一個包含4個元素的一維數(shù)組的指針變量〔行指針變量〕。假設:有一個行長為4的二維數(shù)組a[n][4],且初始化:p=a;(p指向第0行〕那么:p+1:指向第1行之首p+i:指向第i行之首(注:這種p指針變量加1的移動量以數(shù)組行長為單位〕數(shù)組的指針和指向數(shù)組的指針變量注:兩種等值而性質不同的指針值:p與*p,p+1與*(p+1),p+i與*(p+i),(前者為行指針值,增值單位為一行的總地址長;后者為元素指針,增值單位為一個元素地址長。)三、多維數(shù)組的指針作函數(shù)參數(shù)例、score:實參數(shù)組名,average()和search():被調函數(shù)。函數(shù)調用與函數(shù)定義形式:(數(shù)組行長為4:score[][4])average(*score,12);search(score,2);voidaverage(p,n)voidsearch(p,n)float*p;intn;float(*p)[4];intn;{.{.....}}字符串的表示形式1、用字符數(shù)組實現(xiàn)〔已學過〕:main(){staticcharstring[]="ILoveChina!";printf("%s\n",string);}運行時輸出:ILoveChina!2、用字符指針實現(xiàn):字符指針變量的定義:char*p;main(){char*string=“ILoveChina!〞;(初始化string)printf("%s\n",string);}運行時也輸出:ILoveChina!char*str=“Ilovechina〞;等價于以下兩句:char*str;str=“china〞;以上語句的含義:定義str為指針變量,它指向字符型數(shù)據(jù),且賦值語句把字符串“Ilovechina〞的首地址賦給了指針變量str.字符串指針變量的性質:p+1后;新p指向下一字符。9.4.2字符串指針作函數(shù)參數(shù)1.用字符數(shù)組名作參數(shù)〔已學過〕2.用指向字符串的指針變量作參數(shù):如:StringCopy(s,t)char*s,*t;{while(*s++=*t++);}以上循環(huán)語句相當于:while(*t!=‘\0’){*s=*t;s++;t++;}歸納起來,作為函數(shù)參數(shù),有四種情況:實參形參1、數(shù)組名數(shù)組名2、數(shù)組名字符指針變量3、字符指針變量字符指針變量4、字符指針變量數(shù)組名9.4字符串的指針和指向字符串的指針變量9.4.3字符指針變量與字符數(shù)組之區(qū)別1、值的區(qū)別:字符數(shù)組元素存字符;字符指針變量中存放字符的地址。2、賦初值的方式:staticcharstr[]=“Ilovechina!〞;char*a=“Ilovechina!〞;3、賦值的方式:字符數(shù)組:a[0]=‘I’;a[1]=‘’;a[2]=‘L’;….;字符指針變量:char*a;a=“ILoveChina!〞;但應注意:賦給a的不是字符,而是字符串的首地址。4、賦初值時,字符指針變量有兩種等價方式:char*a=“ILoveChina!〞;或:char*a;a=“ILoveChina!〞;對字符數(shù)組初始化時:staticcharstr[14]=“ILoveChina!〞;〔正確〕不能等價于:charstr[14];str[]=“ILoveChina!〞;〔錯誤〕即數(shù)組不能在賦值語句中整體賦值。5.假設a是字符指針變量,在用以下語句時:scanf(“%s〞,a);首先a應有確定值,即應先使a指向數(shù)組的開頭。main(){char*a="ILoveChina";a=a+7;printf("%s",a);}程序輸出結果:China!7、用指針變量指向一個格式字符串。如:char*format;format=“a=%d,b=%f\n〞;那么以下兩句等同:printf(format,a,b);printf(“a=%d,b=%f\n〞,a,b);函數(shù)的指針和指向函數(shù)的指針變量9.5.1用函數(shù)指針變量調用函數(shù)函數(shù)指針變量的定義:如:float(*p)();定義了p指向float型函數(shù)。函數(shù)名:代表函數(shù)的入口地址。假設:intmax(x,y);int(*p)();p=max;那么:c=max(5,8);相當于c=(*p)(5,8);〔兩種等價調用函數(shù)的方式〕max(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}main(){intmax〔〕;int〔*p)();inta,b,c;p=max;scanf("%d,%d",&a,&b);c=(*p)(a,b);printf("a=%d,b=%d,max=%d",a,b,c);}函數(shù)名代表函數(shù)的入口地址,“p=max〞的作用是:使p指向函數(shù)的入口地址(見以以下圖〕。maxp指令1指令2……函數(shù)的指針和指向函數(shù)的指針變量9.5.2把指向函數(shù)的指針變量作函數(shù)參數(shù)實參函數(shù)名:f1f2
sub(x1,x2)int(*x1)(),(*x2)();/*定義函數(shù)指
{inta,b,i,j;針變量x1,x2*/…..a=(*x1)(i);---相當于a=f1(i);b=(*x2)(i,j);---相當于a=f2(i,j);……}為何在sub中不直接調用f1,f2函數(shù)呢?〔目的使sub函數(shù)具有通用性,不僅可調用f1,f2函數(shù);還可調用其它函數(shù)?!?.6返回指針值的函數(shù)一個函數(shù)可以帶回整型值、實型值、字符型值,也可以帶回指針型的數(shù)據(jù),即地址。返回指針值的函數(shù),一般定義形式為:類型標識符*函數(shù)名〔參數(shù)表〕;例如:int*a(x,y);a是函數(shù)名,調用它后能得到一個指向整型9.6返回指針值的函數(shù)數(shù)據(jù)的指針〔地址〕。x,y是函數(shù)a的形參。這個函數(shù)前面有一個*,表示此函數(shù)是指針型函數(shù)〔函數(shù)值是指針〕。9.7指針數(shù)組和指向指針的指針9.7.1指針數(shù)組的概念一個數(shù)組,其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個元素都是指針變量。定義形式為:類型標識*數(shù)組名[數(shù)組長度說明]例如:int*p[4]9.7指針數(shù)組和指向指針的指針“int*p[4]〞的含義:定義了一個數(shù)組p,它有四個元素,每個數(shù)組元素〔指針變量〕都可指向一個整型變量。注意:不要寫成int(*p)[4]的形式,這時的p是指向一維數(shù)組的指針變量。指針數(shù)組比較適合用來指向假設干個字符串。9.7指針數(shù)組和指向指針的指針用指針數(shù)組指向假設干個字符串,可使字符串處理更方便。9.7指針數(shù)組和指向指針的指針9.7.2指向指針的指針定義〔例如〕:char**p;p是這樣的一個指針變量,它指向另一個字符指針變量*p,(即*p是指向字符型數(shù)據(jù)的指針變量,而p又是指向*p的指針變量〕。9.7指針數(shù)組和指向指針的指針程序中,如果*p直接指向某一對象〔字符串〕,那么p間接指向該字符串對象。即*p是p間接指向的對象的地址,而**p那么是p間接指向的對象的值。9.7指針數(shù)組和指向指針的指針9.7.3指針數(shù)組作main函數(shù)的形參例如:main(argc,argv)argc,argv就是main函數(shù)的形參。main函數(shù)是由系統(tǒng)調用的,當處于操作命令狀態(tài)下,輸入main函數(shù)所在的文件名,系統(tǒng)就調用main函數(shù)。main函數(shù)的形參從何處得到?9.7指針數(shù)組和指向指針的指針main函數(shù)的形參所對應的實參是在操作命令中給出的。也就是在一個命令行中包括命令名和需要傳給main函數(shù)的參數(shù)。命令行的一般形式為:命令名參數(shù)1參數(shù)2…參數(shù)n命令名和參數(shù)之間用空格分隔。main函數(shù)的形參argc是指命令行中參數(shù)的個數(shù)。9.7指針數(shù)組和指向指針的指針例如,假設有一目標文件名為file1,今想將兩個字符串“China〞,“Beijing〞作為傳給main函數(shù)的參數(shù),命令行可寫為:file1ChinaBeijing命令執(zhí)行后,main函數(shù)中的參數(shù)argc將為3,而main函數(shù)中的第二個參數(shù)argv是一個指向字符串的指針數(shù)組,其數(shù)組元素分別指9.7指針數(shù)組和指向指針的指針向命令行的各個參數(shù)〔參數(shù)均為字符串,注意命令名file1也作為一個參數(shù)〕。即argv[0]是指向字符串“file1〞的首地址,argv[1]是指向字符串“China〞的首地址,argv[2]是指向字符串“Beijing〞的首地址。9.7指針數(shù)組和指向指針的指針帶參數(shù)的main函數(shù)的形式應為如下:main(argc,argv)intargc;char*argv[];{......}9.8有關指針的數(shù)據(jù)類型和指針運算的小結一、有關指針的數(shù)據(jù)類型〔如下表〕inti;定義整型變量i。int*p;p為指向整型變量的指針變量。inta[n];定義整型數(shù)組a,它有n個元素。int*p[n];定義指針數(shù)組p,它由n個指向整型數(shù)據(jù)的指針元素組成。int(*p)[n];p為指向含n個元素
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 采購合同的續(xù)簽條件3篇
- 采購合同框架協(xié)議的解除法律后果3篇
- 采購合同跟蹤的困境與應對策略3篇
- 采購合同的運輸方式3篇
- 采購合同風險識別與管理策略3篇
- 采購合同管理制度解析3篇
- 采購方案與采購合同的違約責任3篇
- 2024年度城市綠地綠化養(yǎng)護與智能管理系統(tǒng)合作協(xié)議3篇
- 2024年度擔保業(yè)務拓展與技術支持合作協(xié)議3篇
- 2024年版專業(yè)擔保公司互保協(xié)議范本版B版
- 《金屬基增容導線技術條件+第2部分:鋁包殷鋼芯耐熱鋁合金絞線》
- DB32 4418-2022《 居住建筑標準化外窗系統(tǒng)應用技術規(guī)程》
- (正式版)SHT 3075-2024 石油化工鋼制壓力容器材料選用規(guī)范
- 燃燒脂肪-流行健身舞蹈智慧樹知到期末考試答案2024年
- 粵23G-T011 預應力混凝土空心方樁
- 2024年廣西交通投資集團有限公司招聘筆試參考題庫附帶答案詳解
- 村委會地震演練方案及流程
- 2024年四川省成考(專升本)生理學護理學專業(yè)考試真題含解析
- 網絡安全攻防演練
- 采購部經理年度工作總結
- pvc電纜保護管制造工藝
評論
0/150
提交評論