第8章 指針類型_第1頁
第8章 指針類型_第2頁
第8章 指針類型_第3頁
第8章 指針類型_第4頁
第8章 指針類型_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章指針類型8.1概述8.2指針變量8.3指針和函數(shù)8.4指向函數(shù)的指針變量8.1概述地址為了方便對內(nèi)存的訪問,每一個內(nèi)存單元都有一個編號,這個編號就是內(nèi)存的地址。C程序中的每一個變量,C程序的每一個函數(shù),在內(nèi)存中都會對應(yīng)一定的內(nèi)存單元。C程序中的每一個函數(shù)經(jīng)過編譯后,生成的目標代碼在內(nèi)存中是連續(xù)存放的,函數(shù)目標代碼的起始地址稱作函數(shù)的首地址,也叫入口地址。在C語言中,函數(shù)名本身就代表著函數(shù)的入口地址。8.1概述指針指針在計算機中,對一個內(nèi)存單元的訪問是通過地址來實現(xiàn)的,地址“指向”需要操作的內(nèi)存單元。因此在C語言中,把地址形象地稱為指針。C語言中定義的變量在內(nèi)存中都對應(yīng)一定的內(nèi)存單元,也就對應(yīng)一個地址。變量對應(yīng)的地址稱作變量的指針。所謂函數(shù)的指針就是函數(shù)的入口地址。指針變量用來存放指針數(shù)據(jù)的變量叫作指針變量。既可以定義一個指針變量用來存放變量的地址,也可以定義一個指針變量用來存放函數(shù)的入口地址。用來存放變量地址的指針變量稱作指向變量的指針變量,簡稱指針變量;用來存放函數(shù)入口地址的指針變量稱作指向函數(shù)的指針變量。8.1概述有了指向變量的指針變量的概念,對變量的訪問就可以間接進行。直接訪問:利用變量名a將86送入存儲單元。

a=86間接訪問:利用指針變量pointer訪問變量a。pointer=&a/*變量a的地址送指針變量pointer*/*pointer=86/*將86送入存儲單元*/8.2指針變量

指針變量的定義指針變量定義的形式為:

基類型*指針變量名 這里“基類型”表示指針變量所指向的變量的類型,“*”表示定義的是指針變量。例如: int*pointer;float*p1,*p2;8.2指針變量指針變量的使用指針變量的賦值可以給指針變量賦地址值,且地址值必須是基類型變量的。為此C語言提供了取地址運算符&,它的作用是取得變量所占用的存儲單元的首地址。例如,語句“inta,*pointer;”之后,可以有語句:

pointer=&a;可以在定義指針變量的同時對其初始化,例如:inta; int*pointer=&a;可以給指針變量賦空值NULL。例如:

p=NULL;通過指針訪問變量8.2指針變量

【例8.1】通過指針變量訪問變量。main(){intx;

/*整型變量x*/floaty;

/*實型變量y*/int*px=&x;/*指向整型變量的指針變量px,并指向x*/float*py=&y;/*指向?qū)嵭妥兞康闹羔樧兞縫y,并指向y*/*px=20;/*通過指針變量px給變量x賦值*/*py=19.600;/*通過指針變量py給變量y賦值*/*px=*px/2;/*通過指針變量px訪問變量x*/y=y+10;

printf("*px=%d,*py=%6.3f\n",*px,*py);

printf("x=%d,y=%6.3f\n",x,y);}程序的執(zhí)行結(jié)果為:*px=10,*py=29.600x=10,y=29.6008.2指針變量

【例8.2】輸入x和y,求兩個數(shù)的和。請注意分別使用x、y和px、py的異同。main(){intx,y;

int*px=&x,*py=&y;

printf("usingx,y:\nenterx,y:");

scanf("%d%d",&x,&y);

printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);

printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);

printf("usingpx,py:\nenterx,y:");

scanf("%d,%d",px,py); /*通過指針輸入x,y*/

printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);

printf("*px=%d,*py=%d,*px+*py=%d\n",*px,*py,*px+*py);}8.2指針變量在兩次均輸入3、5,則程序的運行結(jié)果為:usingx,y:enterx,y:35x=3,y=5,x+y=8*px=3,*py=5,*px+*py=8usingpx,py:enterx,y:35x=3,y=5,x+y=8*px=3,*py=5,*px+*py=88.2指針變量【例8.3】注意&運算符和*運算符混合使用的情況。main(){intx=3,y=4,z,*px,*py;z=*&x;

px=&x;

py=&y;

py=&*px;

printf("x=%d,y=%d,z=%d\n",x,y,z);

printf("*px=%d,*py=%d\n",*px,*py);}程序的執(zhí)行結(jié)果為:x=3,y=4,z=3*px=3,*py=38.2指針變量

【例8.4】輸入a和b兩個整數(shù),按先大后小順序輸出。main(){inta=5,b=9,temp;if(a<b){temp=a;a=b;b=temp;}

printf("\na=%d,b=%d",a,b);}程序運行結(jié)果如下:a=9,b=58.2指針變量【例8.5】重新編寫例8.4。main(){inta=5,b=9;

int*pa=&a,*pb=&b,*p;if(a<b){p=pa;pa=pb;pb=p;}

printf("\na=%d,b=%d",a,b);

printf("\nmax=%d,min=%d",*pa,*pb);}程序運行結(jié)果如下:a=5,b=9max=9,min=58.2指針變量

8.3指針和函數(shù)

指針變量作函數(shù)參數(shù)地址傳遞方式其實也是值傳遞方式,但它是一種特殊的值傳遞方式,它傳遞的不是普通的數(shù)值,而是地址。在函數(shù)調(diào)用時,首先由實參向形參賦值,這時形參和實參的值是相同的,即實參和形參指示了相同的地址單元;所以在函數(shù)調(diào)用過程中,改變形參(地址值)所指示的單元的內(nèi)容,也就相當于改變了實參所指示單元的內(nèi)容,這正是地址傳遞方式的特點。8.3指針和函數(shù)【例8.6】交換a、b的值,然后輸出。swap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}main(){inta=5,b=9;

int*pa=&a,*pb=&b;swap(pa,pb);

printf("na=%d,b=%d",,a,b);}8.3指針和函數(shù)

程序運行結(jié)果如下:a=9,b=58.3指針和函數(shù)

【例8.7】求兩個數(shù)的和、差、積、商。voidf1(intx,inty,int*p1,int*p2,int*p3,int*p4){*p1=x+y;*p2=x-y;*p3=x*y;*p4=x/y;}main(){intx,y,a,b,c,d;

printf("\npleaseenterxy:");/*輸出信息提示輸入兩個整數(shù)*/

scanf("%d%d",&x,&y);f1(x,y,&a,&b,&c,&d);

printf("x+y=%d\n”,a);

printf("x-y=%d\n”,b);8.3指針和函數(shù)

printf("x*y=%d\n”,c);printf("x/y=%d\n”,d);}pleaseenterxy:63↙x+y=9x-y=3x*y=18x/y=28.3指針和函數(shù)

函數(shù)返回地址值一個函數(shù)不僅可以返回整型、實型、字符型等數(shù)據(jù),也可以返回指針類型的數(shù)據(jù),即地址值。當一個函數(shù)返回指針類型數(shù)據(jù)時,應(yīng)當在定義函數(shù)時對返回值的類型進行說明。說明的格式為: 基類型*函數(shù)名(形式參數(shù)表)8.3指針和函數(shù)【例8.8】輸入a,b,c三個數(shù),調(diào)用函數(shù)func,得到其中最大數(shù)的地址。int*func(int*x,int*y,int*z);/*函數(shù)聲明*/main(){inta,b,c,*p;

printf("\nPleaseentera,b,c:\n");

scanf("%d%d%d",&a,&b,&c);p=func(&a,&b,&c);printf("a=%d,b=%d,c=%d,*p=%d\n",a,b,c,*p);}int*func(int*x,int*y,int*z)/*返回地址值的函數(shù)*/{if(*x>=*y&&*x>=*z)return(x);if(*y>=*x&&*y>=*z)return(y);return(z);}8.3指針和函數(shù)

在輸入23、44、59時,程序運行結(jié)果為:Pleaseentera,b,c:234459↙a=23,b=44,c=59,*p=598.4指向函數(shù)的指針變量指向函數(shù)的指針變量的定義指向函數(shù)的指針變量定義方式如下:類型說明符(*指針變量名)();類型說明符指函數(shù)返回值的類型,

int(*fp)();注意:在定義指向函數(shù)的指針變量時,用于括起變量的圓括號不能省略。試比較下面兩種定義的不同含義:

int(*fp)(); /*定義了一個指向函數(shù)的指針變量*/

int*fp(); /*定義了一個返回值是指針的函數(shù)*/8.4指向函數(shù)的指針變量用指向函數(shù)的指針變量調(diào)用函數(shù)定義了指向函數(shù)的指針變量后,就可以通過它來間接調(diào)用所指向的函數(shù)。將函數(shù)的入口地址(函數(shù)名)賦給指向函數(shù)的指針變量;將指向函數(shù)的指針變量(連同圓括號)代替函數(shù)名使用。【例8.9】編寫函數(shù)main,完成“輸入n(n<10)個整數(shù),找出其中最大數(shù)”的功能。max(intn){inti,x,maxinum;scanf("%d",&maxinum);

8.4指向函數(shù)的指針變量for(i=1;i<n;i++){scanf("%d",&x);if(maxinum<x)maxinum=x;

}return(maxinum); }main(){int(*p)();/*定義指向函數(shù)的指針變量*/

intm,n;

p=max; /*p指向函數(shù)maxn*/

scanf("%d",&n);

m=(*p)(n); /*通過指針變量調(diào)用函數(shù)*/

printf("n=%d,Themaxoneis%d\n",n,m);}8.4指向函數(shù)的指針變量指向函數(shù)的指針變量主要應(yīng)用在兩種情況:利用指針進行函數(shù)的選擇調(diào)用:根據(jù)不同的條件,將不同的函數(shù)首地址賦給函數(shù)指針變量,然后通過函數(shù)指針變量來間接地調(diào)用該函數(shù),從而達到根據(jù)不同條件調(diào)用不同函數(shù)的目的?!纠?.10】已知契比雪夫多項式的定義如下:

x (n=1) 2x2-1 (n=2) 4x3-3x (n=3) 8x4-8x2+1 (n=4)

編寫程序,從鍵盤輸入整數(shù)n和實數(shù)x,根據(jù)n的值調(diào)用不同函數(shù),計算多項式的值。8.4指向函數(shù)的指針變量

main()

{floatfn1(float),fn2(float),fn3(float),fn4(float);/*函數(shù)聲明*/

float(*p)(float); /*定義函數(shù)指針變量*/

floatx,result;intn;do{printf("Enterxandn:\n");scanf("%f,%d",&x,&n);}while(n<1||n>4);switch(n){case1:p=fn1;break;case2:p=fn2;break;case3:p=fn3;break;case4:p=fn4;break;/*函數(shù)首地址賦給函數(shù)指針變量*/}8.4指向函數(shù)的指針變量result=(*p)(x);/*通過函數(shù)指針變量調(diào)用函數(shù)*/printf("result=%f",result);}floatfn1(floatz){printf("z=%f",z);return(z);}floatfn2(floatx){floaty;y=2*x*x-1;return(y);}floatfn3(floatx){floaty;y=4*x*x*x-3*x;return(y);}8.4指向函數(shù)的指針變量floatfn4(floatx){floaty;y=8*x*x*x*x-8*x*x+1;return(y);}指向函數(shù)的指針變量作函數(shù)參數(shù):用指向函數(shù)的指針變量作函數(shù)參數(shù),可以把相應(yīng)函數(shù)的入口地址傳送給一個函數(shù)(不妨設(shè)函數(shù)fa),在函數(shù)fa中就可以利用通過參數(shù)傳來的指針變量調(diào)用相應(yīng)的函數(shù)。8.4指向函數(shù)的指針變量【例8.11】編寫程序,從鍵盤輸入整數(shù)n和實數(shù)x,計算契比雪夫多項式的值。要求利用指向函數(shù)的指針變量作函數(shù)參數(shù)來實現(xiàn)。

floatfresu(floatx,float(*pt)(float))/*函數(shù)指針變量作形參*/ {fl

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論