函數指標及其定義和用法,C語言函數指標詳解

2020-07-16 10:04:21
函數指標大家了解一下就行了,用得不多,但一定要認識它。

什麼是函數指標

如果在程式中定義了一個函數,那麼在編譯時系統就會為這個函數程式碼分配一段儲存空間,這段儲存空間的首地址稱為這個函數的地址。而且函數名表示的就是這個地址。既然是地址我們就可以定義一個指標變數來存放,這個指標變數就叫作函數指標變數,簡稱函數指標

那麼這個指標變數怎麼定義呢?雖然同樣是指向一個地址,但指向函數的指標變數同我們之前講的指向變數的指標變數的定義方式是不同的。例如:
int(*p)(int, int);
這個語句就定義了一個指向函數的指標變數 p。首先它是一個指標變數,所以要有一個“*”,即(*p);其次前面的 int 表示這個指標變數可以指向返回值型別為 int 型的函數;後面括號中的兩個 int 表示這個指標變數可以指向有兩個引數且都是 int 型的函數。所以合起來這個語句的意思就是:定義了一個指標變數 p,該指標變數可以指向返回值型別為 int 型,且有兩個整型引數的函數。p 的型別為 int(*)(int,int)。

所以函數指標的定義方式為:

函數返回值型別 (* 指標變數名) (函數參數列);

“函數返回值型別”表示該指標變數可以指向具有什麼返回值型別的函數;“函數參數列”表示該指標變數可以指向具有什麼參數列的函數。這個參數列中只需要寫函數的引數型別即可。

我們看到,函數指標的定義就是將“函數宣告”中的“函數名”改成“(*指標變數名)”。但是這裡需要注意的是:“(*指標變數名)”兩端的括號不能省略,括號改變了運算子的優先順序。如果省略了括號,就不是定義函數指標而是一個函數宣告了,即宣告了一個返回值型別為指標型的函數。

那麼怎麼判斷一個指標變數是指向變數的指標變數還是指向函數的指標變數呢?首先看變數名前面有沒有“*”,如果有“*”說明是指標變數;其次看變數名的後面有沒有帶有形參型別的圓括號,如果有就是指向函數的指標變數,即函數指標,如果沒有就是指向變數的指標變數。

最後需要注意的是,指向函數的指標變數沒有 ++ 和 -- 運算。

如何用函數指標呼叫函數

給大家舉一個例子:
int Func(int x);   /*宣告一個函數*/
int (*p) (int x);  /*定義一個函數指標*/
p = Func;          /*將Func函數的首地址賦給指標變數p*/
賦值時函數 Func 不帶括號,也不帶引數。由於函數名 Func 代表函數的首地址,因此經過賦值以後,指標變數 p 就指向函數 Func() 程式碼的首地址了。

下面來寫一個程式,看了這個程式你們就明白函數指標怎麼使用了:
# include <stdio.h>
int Max(int, int);  //函數宣告
int main(void)
{
    int(*p)(int, int);  //定義一個函數指標
    int a, b, c;
    p = Max;  //把函數Max賦給指標變數p, 使p指向Max函數
    printf("please enter a and b:");
    scanf("%d%d", &a, &b);
    c = (*p)(a, b);  //通過函數指標呼叫Max函數
    printf("a = %dnb = %dnmax = %dn", a, b, c);
    return 0;
}
int Max(int x, int y)  //定義Max函數
{
    int z;
    if (x > y)
    {
        z = x;
    }
    else
    {
        z = y;
    }
    return z;
}
輸出結果是:
please enter a and b:3 4
a = 3
b = 4
max = 4