標籤: 暫無標籤

函數指針是指向函數的指針變數。 因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這裡是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變數后,可用該指針變數調用函數,就如同用指針變數可引用其他類型變數一樣,在這些概念上是一致的。函數指針有兩個用途:調用函數和做函數的參數。

1方法

函數指針的聲明方法為:
函數類型 (標誌符指針變數名) (形參列表);
注1:「函數類型」說明函數的返回類型,「(標誌符指針變數名 )」中的括弧不能省,若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變數指向的函數所帶的參數列表。例如:
int func(int x); "
int (*f) (int x); "
f=func; "
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
注2:函數括弧中的形參可有可無,視情況而定
下面的程序說明了函數指針調用函數的方法:
例一、
#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
int main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
ptr是指向函數的指針變數,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以後就可以用ptr來調用該函數,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變數,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎麼做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而後用指針變數調用它,因此可以先後指向不同的函數。不過注意,指向函數的指針變數沒有++和--運算,用時要小心。
不過,在某些編譯器中這是不能通過的。這個例子的補充如下。
應該是這樣的:
1.定義函數指針類型:
typedef int (*fun_ptr)(int,int);
2.申明變數,賦值:
fun_ptr max_func=max;
也就是說,賦給函數指針的函數應該和函數指針所指的函數原型是一致的。
例二、
#include<stdio.h>
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
void main()
{
typedef void (*funcp)();
funcp pfun= FileFunc;
pfun();
pfun = EditFunc;
pfun();
}

2對比區別

指針函數函數指針的區別:
1,這兩個概念都是簡稱,指針函數是指返回值是指針的函數,即本質是一個函數。我們知道函數都有返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。
其定義格式如下所示:
返回類型標識符*函數名稱(形式參數表)
{函數體}
返回類型可以是任何基本類型和複合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當於一個指針。比如函數返回一個整型值,實際上也相當於返回一個指針變數的值,不過這時的變數是函數本身而已,而整個函數相當於一個「變數」。例如下面一個返回指針函數的例子:
//指針函數是指返回值是指針的函數,即本質是一個函數
#include<iostream>
using namespace std;
int main()
{
float *find(float (*p)[4],int m);//查詢序號為m的學生的四門課程的成績
float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定義成績數組,第一維可以為變數
float *pf=NULL;//定義一個指針時一定要初始化
int i,m;
cout<<"請輸入您想查詢的學生的序號:";
cin>>m;
pf=find(score,m);//返回為一維數組指針,指向一個學生成績
for(i=0;i<4;i++)
cout<<*(pf+i)<<" ";
cout<<endl;
return 0;
}
float *find(float (*p)[4],int m)
{
float *pf=NULL;
pf=*(p+m);//p是指向二維數組的指針,加*取一維數組的指針
return pf;
}學生學號從0號算起,函數find()被定義為指針函數,其形參pointer是指針指向包含4個元素的一維數組的指針變數。pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0個元素。pf是一個指針變數,它指向浮點型變數。main()函數中調用find()函數,將score數組的首地址傳給pointer.
2,「函數指針」是指向函數的指針變數,因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這裡是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變數后,可用該指針變數調用函數,就如同用指針變數可引用其他類型變數一樣,在這些概念上一致的。函數指針有兩個用途:調用函數和做函數的參數。

3指針數組

賦值
為函數指針數組賦值有兩種方式:靜態定義和動態賦值。
1. 靜態定義
在定義函數指針數組的時候,已經確定了每個成員所對應的函數。例如:
void (*INTARRAY[])(void) = {Stop,Run,Jump};
從根本上講函數指針數組依然是數組,所以和數組的定義類似,由於是靜態賦值,[ ]裡面的數字可以
省略。這個函數指針數組的成員有三個。
INTARRAY[1](); //執行Run函數
2. 動態賦值
也可以先定義一個函數指針數組,在需要的時候為其賦值。為了還原它本來的面目,我們先對這個執行特定類型的函數指針進行類型重定義,然後再用這個新數據類型來定義數組。如下:
typedef void (*INTFUN)(void); //此類型的函數指針指向的是無參、無返回值的函數。
INTFUN INTARRAY[32]; //定義一個函數指針數組,其每個成員為INTFUN類型的函數指針
INTARRAY[10] = INT_TIMER0; //為其賦值
INTARRAY[10](); //調用函數指針數組的第11個成員指向的函數
此內容來源矽谷芯微·技術中心(www-threeway-cc)

相關評論

同義詞:暫無同義詞