C++ essential(Day 3)

  • 函數指針指向某種特定類型,函數的類型由其參數及返回類型共同決定,與函數名無關。舉例如下:

data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);
eg:int add(int nLeft,int nRight);//函數定義 
  • 該函數類型爲int(int,int),要想聲明一個指向該類函數的指針,只需用指針替換函數名即可
    int (*pf)(int,int);//未初始化  
    //這裏就定義了一個指向某函數(這個函數參數僅僅爲兩個 int 類型,函數返回值是 int 類型)的指針 fp。

     則pf可指向int(int,int)類型的函數。pf前面有*,說明pf是指針,右側是形參列表,表示pf指向的是函數,左側爲int,說明pf指向的函數返回值爲int。則pf可指向int(int,int)類型的函數。而add類型爲int(int,int),則pf可指向add函數。

    pf = add;//通過賦值使得函數指針指向某具體函數  

    注意:*pf兩端的括號必不可少,否則若爲如下定義:

    int *pf(int,int);//此時pf是一個返回值爲int*的函數,而非函數指針  

     

        typedef 定義可以簡化函數指針的定義

 

 

int test(int a) 
{
     return a; 
} 
int main(int argc, const char * argv[]) 
{ 
    typedef int (*fp)(int a); 
    fp f = test; 
    cout<<f(2)<<endl; 
    return 0; 
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  • 函數指針同樣是可以作爲參數傳遞給函數的
int test(int a) 
{
     return a-1; 
} 
int test2(int (*fun)(int),int b) 
{ 
    int c = fun(10)+b; 
    return c; 
} 
int main(int argc, const char * argv[]) 
{ 
    typedef int (*fp)(int a);
    fp f = test; cout<<test2(f, 1)<<endl; 
    // 調用 test2 的時候,把test函數的地址作爲參數傳遞給了 test2 
    return 0; 
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

執行以上代碼,輸出結果爲:

10
  • 利用函數指針,我們可以構成函數指針數組,更明確點的說法是構成指向函數的指針數組。
    void t1() 
    {
    	cout << "test1" << endl;
    } 
    void t2() 
    { 
    	cout << "test2" << endl;
    }
    void t3() 
    { 
    	cout << "test3" << endl; 
    } 
    int main(int argc, const char * argv[]) 
    {
    	typedef void(*fp)(void); 
           fp b[] = { t1,t2,t3 }; 
    	// b[] 爲一個指向函數的指針數組
    	b[0](); 
    	// 利用指向函數的指針數組進行下標操作就可以進行函數的間接調用了 
    	return 0; 
    }

     

  • extern 存儲類

    extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 'extern' 時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。

    當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這麼理解,extern 是用來在另一個文件中聲明一個全局變量或函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章