一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

指針的用法之函數(shù)指針 (amoBBS 阿莫電子論壇)

 BlackBluePLC 2014-06-26

  最近在忙著學(xué)習(xí)移植操作系統(tǒng),但是操作系統(tǒng)全是由c語(yǔ)言編程實(shí)現(xiàn)的,里面的各式各樣的指針用法都有,所以將指針用法復(fù)習(xí)了一遍,現(xiàn)在把我的學(xué)習(xí)筆記貼出來(lái),感興趣的都一起學(xué)習(xí)學(xué)習(xí)吧

另:該文檔屬原創(chuàng),轉(zhuǎn)載請(qǐng)說(shuō)明出處
1、             指向函數(shù)的指針

一個(gè)函數(shù)在編譯的時(shí)候,分配一個(gè)入口地址,這個(gè)函數(shù)的入口地址就稱為函數(shù)的指針??梢酝ㄟ^(guò)一個(gè)指針變量指向函數(shù),然后通過(guò)該指針變量調(diào)用此函數(shù)。



#include <stdio.h>

Void mian ()

{

   Int max(int,int);

   Int (*p)(int,int);

   Int a,b,c;

   P=max;

   Scanf(“%d,%d”,&a,&b);

C=(*p)(a,b);

Printf(“max=%d”,c);

}

其中 Int (*p)(int,int);用來(lái)定義p是一個(gè)指向函數(shù)的指針變量 ,該函數(shù)有兩個(gè)整型參數(shù),函數(shù)值為整型。

注意*p兩側(cè)的括號(hào)不可以省略,表示p先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù)



如果寫成 int *p(int ,int); 則由于()優(yōu)先級(jí)高于*,它就成了聲明一個(gè)p函數(shù)了(這個(gè)函數(shù)的返回值是指向整型變量的指針)。



賦值語(yǔ)句“p=max;”的作用是將函數(shù)max的入口地址賦給指針變量p。和數(shù)組名代表數(shù)組首元素地址類似 ,函數(shù)名代表該函數(shù)的入口地址。這時(shí),p就是指向函數(shù)max的指針變量,p和max都是指向函數(shù)的開頭。但是不能用*(p+1)表示函數(shù)的下一條指令。



注意:

(1)      指向函數(shù)的指針變量定義形式

數(shù)據(jù)類型 (*指針變量名)(函數(shù)參數(shù)列表);

       這里的數(shù)據(jù)類型指函數(shù)返回值的類型。

(2)      函數(shù)調(diào)用可以通過(guò)函數(shù)名,也可以通過(guò)函數(shù)指針

(3)      Int(*p)(int,int);表示定義一個(gè)指向函數(shù)的指針變量P,不是固定指向某一個(gè)函數(shù),而只是表示定義了這樣一個(gè)類型的變量,它是專門存放函數(shù)的入口地址的,在一個(gè)程序中,一個(gè)指針變量可以先后指向同類型的不同函數(shù)。

(4)      給指針變量賦值時(shí),只需給出函數(shù)名而不必給出參數(shù)
如p=max;
因?yàn)檫@是將函數(shù)的入口地址賦給p,而不牽涉實(shí)參和形參的結(jié)合問(wèn)題,不能寫成
p=max(a,b);

(5)      用函數(shù)指針變量調(diào)用參數(shù)時(shí),只需將(*P)代替函數(shù)名即可,在(*p)之后的括號(hào)中,根據(jù)需要寫上實(shí)參。如
c=(*p)(a,b)
表示“調(diào)用由p指向的函數(shù),實(shí)參為a,b得到的函數(shù)值賦給 c”

(6)      對(duì)指針函數(shù)的指針變量,像p++,p+n,p—等運(yùn)算是沒有意義的。





2、             用指向函數(shù)的指針作函數(shù)的參數(shù)



原理:有一個(gè)sub函數(shù),它有兩個(gè)形參x1,x2,定義x1,x2為指向函數(shù)的指針變量。在調(diào)用函數(shù)sub時(shí),實(shí)參為另個(gè)函數(shù)名f1,f2,給形參傳遞的是函數(shù)f1,f2的地址。這樣在函數(shù)sub中就可以調(diào)用f1,f2了。如:



實(shí)參函數(shù)名     f1       f2      

void sub(int(*x1)(int),int(*x2)(int))

{

   inta,b,i,j;

   a=(*x1)(i);

   b=(*x2)(i,j);

}

      為什么不直接調(diào)用f1,f2函數(shù)呢,而要用函數(shù)指針變量呢? 如果只是用到f1,f2函數(shù),完全可以在sub函數(shù)中直接調(diào)用f1,f2;但是如果在每次調(diào)用sub函數(shù)時(shí),要調(diào)用的函數(shù)不是固定的,這次調(diào)用f1f2,下次可能需要調(diào)用f3,f4,這時(shí),用指針變量就比較方便了。只要在每次調(diào)用sub函數(shù)時(shí)給出不同的函數(shù)名作為實(shí)參即可。

              如:
#include <stdio.h>



void main()

{

              int max(int,int);

              int min(int,int);

              int add(int,int);

              voidprocess(int,int,int(*fun)(int,int));



              //以上是函數(shù)聲明



              int a,b;

              printf("enter a andb:");

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

              printf("max=");

              process(a,b,max);

              printf("min=");

              process(a,b,min);

              printf("sum=");

              process(a,b,add);



}

//函數(shù)定義

int max(int x,int y)

{

              int a;

              if(x>y)

                   a=x;

              else

                   a=y;

              return (a);

}

int min (int x,int y)

{

              int z;

              if(x>y)

                   z=y;

              else

                   z=x;

              return z;

}

int add(int x,inty)

{

              int z;

              z=x+y;

              return z;

}

void process(int x,inty,int(*fun)(int,int))

{

              int  result;

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

              printf("%d\n",result);

}

運(yùn)行結(jié)果:

Enter a and b :1,6

Max=6

Min=1

Sum=7



分析:在定義process函數(shù)時(shí),在函數(shù)首部用int (*fun)(int,int)表示fun是指向函數(shù)的指針,該函數(shù)是一個(gè)整型函數(shù),有兩個(gè)整型實(shí)參。

注意,對(duì)作為實(shí)參的函數(shù),應(yīng)在主調(diào)函數(shù)中用原型作函數(shù)聲明。

參考:譚浩強(qiáng) 《C程序設(shè)計(jì)》第三版

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    激情爱爱一区二区三区| 久久久免费精品人妻一区二区三区| 国产国产精品精品在线| 午夜福利国产精品不卡| 欧洲自拍偷拍一区二区| 深夜视频在线观看免费你懂| 国产又粗又爽又猛又黄的| 欧美成人高清在线播放| 欧美性欧美一区二区三区| 欧美人妻免费一区二区三区 | 午夜福利视频六七十路熟女| 日韩欧美91在线视频| 精品少妇一区二区三区四区| 亚洲中文字幕一区三区| 日韩欧美一区二区亚洲| 黄色三级日本在线观看| 中文字幕一区二区三区大片| 中文字字幕在线中文乱码二区| 黄片免费播放一区二区| 日韩中文无线码在线视频| 欧美日韩综合在线精品| 国产人妻精品区一区二区三区| 亚洲中文字幕免费人妻| 在线免费视频你懂的观看| 久久一区内射污污内射亚洲| 国产成人精品国产成人亚洲| 久热久热精品视频在线观看| 色婷婷视频国产一区视频| 视频一区二区三区自拍偷| 日韩av生活片一区二区三区| 日本中文字幕在线精品| 欧美一区二区三区不卡高清视| 九九热在线免费在线观看| 男女午夜福利院在线观看| 欧美午夜国产在线观看| 日本一本在线免费福利| 色哟哟在线免费一区二区三区| 国产日韩精品激情在线观看| 中文字幕亚洲精品人妻| 国产又粗又爽又猛又黄的| 中文字幕亚洲视频一区二区|