1. 程式人生 > 實用技巧 >C 函式指標語法總結

C 函式指標語法總結

C 函式指標語法總結

函式指標

定義

每一個函式都佔用一段記憶體單元,它們有一個起始地址,指向函式入口地址的指標稱為函式指標

注意:函式指標的本質是一個指標變數,且指標指向的函式的入口地址

語法

返回型別 (*函式名) (引數表);

例:

#include <iostream>
 
using namespace std;
//定義一個函式指標pFUN,它指向一個返回型別為char,有一個整型的引數的函式
char (*pFun)(int);
//定義一個返回型別為char,引數為int的函式
//從指標層面上理解該函式,即函式的函式名實際上是一個指標,
//該指標指向函式在記憶體中的首地址
char glFun(int a)
{
    cout << a;
    //return a;
}
 
int main()
{
//將函式glFun的地址賦值給變數pFun
    pFun = glFun;
//*pFun”顯然是取pFun所指向地址的內容,
當然也就是取出了函式glFun()的內容,然後給定引數為2。
    (*pFun)(2);
    //pfun(2);  也是對的
    return 0;
}

函式指標型別

語法

typedef 返回型別 (*函式名) (引數表);

例:

#include <iostream>
 
using namespace std;
//定義一個函式指標型別
typedef char (*mypFun)(int);
//定義一個返回型別為char,引數為int的函式
//從指標層面上理解該函式,即函式的函式名實際上是一個指標,
//該指標指向函式在記憶體中的首地址
char glFun(int a)
{
    cout << a;
    //return a;
}
 
int main()
{
//定義一個函式指標變數,將函式glFun的地址賦值給變數myp
    mypFun myp = glFun;
//*pFun”顯然是取pFun所指向地址的內容,
//當然也就是取出了函式glFun()的內容,然後給定引數為2。
    (*myp)(2);
    //myp(2);  也是對的
    return 0;
}

歷史與邏輯

(*myp)(2);	//下文用 星myp表示
myp(2);  
//兩種寫法都是對的

真是非常棒的語法! 為何 myp 和 ( 星 myp)等價呢?一種學派認為,由於 myp 是函式指標,而 ( 星 myp)是函式,因此應將 ( 星 myp)() 用作函式呼叫。另一種學派認為,由於函式名是指向該函式的指標,指向函式的指標的行為應與函式名相似,因此應將 myp() 用作函式呼叫使用。C++ 進行了折衷——這 2種方式都是正確的,或者至少是允許的,雖然它們在邏輯上是互相沖突的。在認為這種折衷粗糙之前,應該想到,容忍邏輯上無法自圓其說的觀點正是人類思維活動的特點。