C程序設(shè)計11-用指針變量訪問下標(biāo)變量_第1頁
C程序設(shè)計11-用指針變量訪問下標(biāo)變量_第2頁
C程序設(shè)計11-用指針變量訪問下標(biāo)變量_第3頁
C程序設(shè)計11-用指針變量訪問下標(biāo)變量_第4頁
C程序設(shè)計11-用指針變量訪問下標(biāo)變量_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十一章用指針變量訪問下標(biāo)變量主要內(nèi)容概述:用指針變量訪問下標(biāo)變量的原因及預(yù)備知識一2023/2/51用指針變量訪問下標(biāo)變量的方法二用指針變量訪問下標(biāo)變量的適用場合三通過指針變量訪問下標(biāo)變量的原因靈活數(shù)組名作為指針時,是不可改變的,所指對象是固定的指針變量所指對象可以改變效率高(不詳細(xì)講)特定情況下比較效率,需要匯編語言的知識效率其實差別不大有些地方不允許用數(shù)組名表示下標(biāo)變量2023/2/52第一節(jié)概述for(i=0;i<=999999;i++)printf(“%d”,*(a+i));70.5870.3170.3070.18for(p=a,i=0;i<=999999;i++)printf(“%d”,*(p+i));70.0670.2669.5769.68for(p=a,i=0;i<=999999;i++)printf(“%d”,*(p++));70.4970.3269.6769.86for(p=a;p<=a+999999;p++)printf(“%d”,*p);70.8870.0670.1770.152023/2/53預(yù)備知識(知識回顧)1.用指針變量訪問普通變量的方法主函數(shù)中定義指針變量inta,*p;使指針變量指向一個對象p=&a;間接訪問*p=100;被調(diào)函數(shù)中intmain(){inta;

}voidf(){

}f(&a);............*p=100;......int*p第二節(jié)用到第三節(jié)用到第一節(jié)概述2023/2/54預(yù)備知識(知識回顧)2.數(shù)組名作為指針時,指向它的首元素一維數(shù)組的數(shù)組名,指向下標(biāo)變量二維數(shù)組的數(shù)組名,指向一維數(shù)組三維數(shù)組的數(shù)組名,指向二維數(shù)組......3.數(shù)組中的下標(biāo)變量在內(nèi)存中是連續(xù)存放的4.指針的運算指針加1,指向下一個對象,指針減一,指向上一個對象指針增加(減少)一個值,仍然是指針,類型不變2023/2/55第二節(jié)用指針變量訪問下標(biāo)變量的方法用指針變量訪問一維數(shù)組中的下標(biāo)變量12本節(jié)主要內(nèi)容用指針變量訪問二維數(shù)組中的下標(biāo)變量2023/2/56設(shè)有數(shù)組定義“inta[4];”,如何通過指針變量使a[0]變成100?通過指針變量訪問普通變量的方法(主函數(shù)中)定義指針變量inta,*p;給指針變量賦值p=&a;間接訪問*p=100;故訪問下標(biāo)變量a[0]的代碼應(yīng)是:定義指針變量inta[4],*p;給指針變量賦值p=&a[0];間接訪問*p=100;11.2.1

用指針變量訪問一維數(shù)組的下標(biāo)變量//p=a;2023/2/57要訪問a[0]、a[1]、a[2]...,如何操作?inta[4],*p;p=a;*p=100;*(p+1)=200;//a[1]=200;*(p+2)=300;//a[2]=300;......或者:

inta[4],*p;p=a;*p=100;p++;*p=200;p++;*p=300;......11.2.1

用指針變量訪問一維數(shù)組的下標(biāo)變量數(shù)組元素是連續(xù)存放的pp+1p+2p+3a[0]a[1]a[2]a[3]p訪問a[0]的代碼p指針加1,指向下一個對象2023/2/58練習(xí):利用指針變量輸出一維數(shù)組的所有元素解法1:inta[10]={1,2,3,4,5,6,7,8,9,0},*p,i;p=a;for(i=0;i<=9;i++)printf(“%3d”,*(p+i));

思考:若一開始讓p指向a[1],能否輸出所有元素的值?解法2:inta[10]={1,2,3,4,5,6,7,8,9,0},*p=a,i;for(i=0;i<=9;i++)printf(“%3d”,*(p++));解法3:inta[10]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<=a+9;p++)printf(“%3d”,*p);11.2.1

用指針變量訪問一維數(shù)組的下標(biāo)變量printf(“%3d”,*p);p++;*(p+i)也可以寫成:p[i]2023/2/59例:輸入10個整數(shù)存入數(shù)組,求和(通過指針變量)#include<stdio.h>intmain(){inta[10],i,sum=0,*p=a;for(i=0;i<=9;i++){scanf(“%d”,p);

sum+=*p;

p++;

}

printf(“%d\n”,sum);

return0;}

思考:循環(huán)結(jié)束時,p指向哪里?11.2.1

用指針變量訪問一維數(shù)組的下標(biāo)變量2000p2000200420082012......1sum0i1012320042008通過指針變量訪問二維數(shù)組中下標(biāo)變量的方法

inta[3][4],*p;p=&a[0][0];......//可訪問任意一個下標(biāo)變量

說明:上面的“p=&a[0][0];”,不要寫成:

p=a;//會被警告。賦值后p指向什么?最簡潔的寫法是:

p=a[0];或

p=*a;

2023/2/51011.2.2

用指針變量訪問二維數(shù)組的下標(biāo)變量a[0][0]a[0][1]a[0][2]a[0][3]pp+1p+2p+3p20002000a[1][0]p+4例:用指針變量輸出二維數(shù)組中各下標(biāo)變量的值方法1:inta[2][3]={1,2,3,4,5,6},*p=a[0],i,j;for(i=0;i<=1;i++)for(j=0;j<=2;j++)printf(“%3d”,*(p+3*i+j));方法2:

inta[2][3]={1,2,3,4,5,6},*p=a[0],i;for(i=0;i<=5;i++)printf(“%3d”,*(p+i));//*(p+i)也可寫成*(p++)方法3:inta[2][3]={1,2,3,4,5,6},*p;for(p=a[0];p<=a[0]+5;p++)printf(“%3d”,*p);2023/2/51111.2.2

用指針變量訪問二維數(shù)組的下標(biāo)變量p<=a[0]+5改成p<=a+5可否?結(jié)果會怎樣?例:鍵盤輸入三行字符,統(tǒng)計大寫字母出現(xiàn)的次數(shù)#include<stdio.h>intmain(){chars[3][81],*p;inti,sum=0;for(i=0;i<=2;i++)gets(s[i]);for(i=0;i<=2;i++)for(p=s[i];*p!=0;p++)if(*p>=65&&*p<=90)sum++;printf(“%d\n”,sum);return0;}2023/2/51211.2.2

用指針變量訪問二維數(shù)組的下標(biāo)變量2023/2/513用指針變量訪問下標(biāo)變量的場合數(shù)組名作參數(shù)本節(jié)主要內(nèi)容1第三節(jié)用指針變量訪問下標(biāo)變量的場合2voidf(...){............}2023/2/514討論:在哪訪問下標(biāo)變量?在數(shù)組定義所在的函數(shù)中訪問可用數(shù)組名訪問可用指針變量訪問在其他函數(shù)中訪問僅使用,不修改

傳遞數(shù)組元素的地址(傳一個地址即可:f(a))修改數(shù)據(jù)傳值:無法修改傳遞地址(傳一個地址即可:f(a))11.3.1

用指針變量訪問下標(biāo)變量的場合此時,就需要用變量地址作實參,指針變量作形參,通過指針變量訪問下標(biāo)變量intmain(){

inta[10];......}傳遞整個數(shù)組:f(a);//傳遞每個數(shù)組元素的值:f(a[0],a[1],a[2]…a[9])2023/2/515示意圖:(以一維數(shù)組為例)

主調(diào)函數(shù)被調(diào)函數(shù)

intmain()sub(int*p){{inta[10]……sub(a);……}

}11.3.2

數(shù)組名作參數(shù)相當(dāng)于執(zhí)行:p=a;2023/2/516例:主函數(shù)定義數(shù)組inta[5]={3,5,2,8,6},編寫被調(diào)函數(shù)以計算所有數(shù)據(jù)之和(僅使用,不修改)intsum(int*p)//參數(shù)傳遞后,p指向?{inti,s=0;//此s并非主函數(shù)中的sfor(i=0;i<=4;i++)s+=*(p++);returns;}intmain(){inta[5]={3,5,2,8,6},s;s=sum(a);//實參a即&a[0]printf(“%d\n”,s);return0;}11.3.2

數(shù)組名作參數(shù)2023/2/517例:主函數(shù)定義數(shù)組inta[5]={3,5,2,8,6},編寫被調(diào)函數(shù)使數(shù)組中每個元素都變成原來的兩倍(修改數(shù)據(jù))voiddb(int*p)//參數(shù)傳遞后,p指向a[0]{inti;for(i=0;i<=4;i++)*p=*(p++)*2;}intmain(){inta[5]={3,5,2,8,6},i;db(a);//實參a,就是&a[0]for(i=0;i<=4;i++)printf(“%3d”,a[i]);return0;}11.3.2

數(shù)組名作參數(shù)2023/2/518上面兩個例子中,形參“int*p”都可聲明成

int

p[],兩者等價voiddb(intp[])//p還是個指針變量{inti;for(i=0;i<=4;i++)*p=*(p++)*2;//p[i]=p[i]*2;}intmain(){inta[5]={3,5,2,8,6},i;db(a);for(i=0;i<=4;i++)printf(“%3d”,a[i]);return0;}11.3.2

數(shù)組名作參數(shù)2023/2/519關(guān)于intp[]和int*p等價的驗證:intmain(){voidsub(int[]);inta[10]={1,3,5,2,7,9,6,8,0,4};printf(“%d,",sizeof(a));printf(“%p,",a);printf(“%p\n",&a);sub(a);printf("%p\n",a);return0;}voidsub(intx[]){printf("%d,",sizeof(x));printf("%p,",x);printf("%p,",&x);x++;printf("%p\n",x);}TC下的運行結(jié)果:20,FFCC,FFCC2,

FFCC,FFCA,FFCEFFCC11.3.2

數(shù)組名作參數(shù)2023/2/520例:主函數(shù)給inta[3][5]輸入數(shù)據(jù),被調(diào)函數(shù)找出最大數(shù)和最小數(shù),存入主函數(shù)定義的變量中,主函數(shù)輸出#include<stdio.h>voidsub(int*,int*,int*);intmain(){inta[3][5],max,min,i,j;for(i=0;i<=2;i++) for(j=0;j<=4;j++) scanf("%d",&a[i][j]);sub(a[0],&max,&min);

printf("%d,%d\n",max,min);return0;}11.3.2

數(shù)組名作參數(shù)2023/2/521voidsub(int*p,int*pmax,int*pmin){inti;*pmax=*pmin=*p;for(i=1;i<=14;i++){if(*pmax<p[i])*pmax=p[i];if(*pmin>p[i])*pmin=p[i];}}11.3.2

數(shù)組名作參數(shù)2023/2/522課外思考:下面程序的問題是什么?題目:二維數(shù)組存3人成績,求總平均分

#include<stdio.h>

floataverage(int*,int);

int

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論