最近在忙著學(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ì)》第三版 |
|
來(lái)自: BlackBluePLC > 《C語(yǔ)言》