最近在忙著學(xué)習(xí)移植操作系統(tǒng),但是操作系統(tǒng)全是由c語言編程實現(xiàn)的,里面的各式各樣的指針用法都有,所以將指針用法復(fù)習(xí)了一遍,現(xiàn)在把我的學(xué)習(xí)筆記貼出來,感興趣的都一起學(xué)習(xí)學(xué)習(xí)吧
另:該文檔屬原創(chuàng),轉(zhuǎn)載請說明出處
1、 指向函數(shù)的指針
一個函數(shù)在編譯的時候,分配一個入口地址,這個函數(shù)的入口地址就稱為函數(shù)的指針。可以通過一個指針變量指向函數(shù),然后通過該指針變量調(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);用來定義p是一個指向函數(shù)的指針變量 ,該函數(shù)有兩個整型參數(shù),函數(shù)值為整型。
注意*p兩側(cè)的括號不可以省略,表示p先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù)
如果寫成 int *p(int ,int); 則由于()優(yōu)先級高于*,它就成了聲明一個p函數(shù)了(這個函數(shù)的返回值是指向整型變量的指針)。
賦值語句“p=max;”的作用是將函數(shù)max的入口地址賦給指針變量p。和數(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)用可以通過函數(shù)名,也可以通過函數(shù)指針。
(3) Int(*p)(int,int);表示定義一個指向函數(shù)的指針變量P,不是固定指向某一個函數(shù),而只是表示定義了這樣一個類型的變量,它是專門存放函數(shù)的入口地址的,在一個程序中,一個指針變量可以先后指向同類型的不同函數(shù)。
(4) 給指針變量賦值時,只需給出函數(shù)名而不必給出參數(shù)
如p=max;
因為這是將函數(shù)的入口地址賦給p,而不牽涉實參和形參的結(jié)合問題,不能寫成
p=max(a,b);
(5) 用函數(shù)指針變量調(diào)用參數(shù)時,只需將(*P)代替函數(shù)名即可,在(*p)之后的括號中,根據(jù)需要寫上實參。如
c=(*p)(a,b)
表示“調(diào)用由p指向的函數(shù),實參為a,b得到的函數(shù)值賦給 c”
(6) 對指針函數(shù)的指針變量,像p++,p+n,p—等運算是沒有意義的。
2、 用指向函數(shù)的指針作函數(shù)的參數(shù)
原理:有一個sub函數(shù),它有兩個形參x1,x2,定義x1,x2為指向函數(shù)的指針變量。在調(diào)用函數(shù)sub時,實參為另個函數(shù)名f1,f2,給形參傳遞的是函數(shù)f1,f2的地址。這樣在函數(shù)sub中就可以調(diào)用f1,f2了。如:
實參函數(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ù)時,要調(diào)用的函數(shù)不是固定的,這次調(diào)用f1f2,下次可能需要調(diào)用f3,f4,這時,用指針變量就比較方便了。只要在每次調(diào)用sub函數(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);
}
運行結(jié)果:
Enter a and b :1,6
Max=6
Min=1
Sum=7
分析:在定義process函數(shù)時,在函數(shù)首部用int (*fun)(int,int)表示fun是指向函數(shù)的指針,該函數(shù)是一個整型函數(shù),有兩個整型實參。
注意,對作為實參的函數(shù),應(yīng)在主調(diào)函數(shù)中用原型作函數(shù)聲明。
參考:譚浩強 《C程序設(shè)計》第三版
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。