天天看點

【C/C++】函數指針與指針函數

作者:柒号華仔

個人首頁:歡迎通路我的首頁

個人信條:星光不問趕路人,歲月不負有心人。

個人方向:主要方向為5G,同時兼顧其他網絡協定,編解碼協定,C/C++,linux,雲原生等,感興趣的小夥伴可以關注我,一起交流。

1. 函數指針

1.1 概念定義

函數指針是指向函數的指針變量。 是以函數指針本質上是一個指針變量,隻不過該指針變量指向函數。指針變量也可以指向整型變量、字元型、數組,也可以指向函數。

C語言中,每一個函數都有一個入口位址,函數指針就指向函數的入口位址,可以通過函數指針來調用函數。

例如 :int (*fun)(int x,int y);

另外定義一個常用函數為 void func( ),那麼fun=func; fun這時就是 func( )這個函數的入口位址了。

1.2 聲明方法

函數指針的聲明方法為:

傳回值類型 ( * 指針變量名) ([形參清單])

“傳回值類型”說明函數的傳回類型,“(指針變量名 )”中的括号不能省,括号改變了運算符的優先級,後面的“形參清單”表示指針變量指向的函數所帶的參數清單。例如:

int func(int x);    //聲明一個函數
int (*fun)(int x,int y);  //聲明一個函數指針 
fun = func;        // 将func函數的首位址賦給指針fun      

或者将函數位址賦給函數指針:

fun = &func;      

指派時函數func不帶括号,也不帶參數,由于func代表函數的首位址,是以經過指派以後,指針fun就指向函數func(x)的首位址。

1.3 調用方法

下面的執行個體說明了函數指針調用函數的方法:

#include <stdio.h>
  
//傳回兩個數中較大的一個
int max(int a, int b){
    return a>b ? a : b;
}

int main(){
    int x, y, maxval1,maxval2;
    int (*pmax)(int, int); //定義函數指針
    pmax = max;

    printf("Input two numbers:");
    scanf("%d %d", &x, &y);

    maxval1 = (*pmax)(x,y);
    printf("Max value 1: %d\n", maxval1);

    maxval2 = pmax(x,y);
    printf("Max value 2: %d\n", maxval2);

    return 0;
}      

運作結果:

Input two numbers:5 8
Max value 1: 8
Max value 2: 8      

maxval1 = (pmax)(x,y)對函數進行了調用。pmax 是一個函數指針,在前面加 * 就表示對它指向的函數進行調用。注意( )的優先級高于,第一個括号不能省略。

maxval2 = pmax(x,y),pmax就是函數max的入口位址,pmax(x,y)等同于max(x,y)。

注意這裡pmax是一個指針變量,它可以指向任何函數,也就是說這裡指向了函數max(),但它也可以再指向其他函數。如果我們直接調用函數名稱,比如max,那麼它是不可變的。

1.4 函數指針作為函數參數

#include <stdio.h>
  
//傳回兩個數中較大的一個
int max(int a, int b){
    return a>b ? a : b;
}

int fun(int (*pfun)(int, int), int a, int b){
    pfun(a,b);
}

int main(){
    int x, y, maxval;
    
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);

    maxval = fun(max,x,y);
    printf("Max value: %d\n", maxval);

    return 0;
}      

運作結果:

Input two numbers:5 8
Max value: 8      

maxval = fun(max,x,y)将函數max的入口位址傳給了fun的形參pfun,調用pfun實際就調用了函數max。

1.5 函數指針數組

函數指針數組是一個元素均為函數指針的數組。

#include <stdio.h>
  
//傳回兩個數中較大的一個
int max(int a, int b){
    return a>b ? a : b;
}

//傳回兩個數中較小的一個
int min(int a, int b){
    return a<b ? a : b;
}

int main(){
    int x, y, maxval, minval;

    int(*arr[2])(int x, int y) = { max, min};
    printf("Input two numbers:");
    scanf("%d %d", &x, &y);

    maxval = arr[0](x,y);
    printf("Max value: %d\n", maxval);
    minval = arr[1](x,y);
    printf("Min value: %d\n", minval);

    return 0;
}      

運作結果:

Input two numbers:5 8
Max value: 8
Min value: 5      

int(*arr[2])(int x, int y) = { max, min}定義的是一個指針函數數組,數組兩個元素分别為函數max和函數min的位址,調用數組arr元素實際就調用了對應函數,這一點始終沒變。

2. 指針函數

2.1 概念定義

指針函數是非常常見的,它是一個函數,隻不過這個函數的傳回值是一個位址值。函數傳回值必須用同類型的指針變量來接受,也就是說,指針函數一定有“函數傳回值”,而且,在主調函數中,函數傳回值必須賦給同類型的指針變量。

例如: int *fun(x,y); 其結構為 類型辨別符 函數名(參數)

fun是一個函數,隻是傳回值是一個int型的指針,如果不加,它依然是一個函數,隻是傳回值是一個int整型數。

2.2 調用方法

#include <stdio.h>
  
//傳回兩個數中較大的一個
int *max(int *a, int *b){
    int *ptr;

    ptr = *a>*b ? a : b;
    return ptr;
}

int main(){
    int x, y, *maxval;

    printf("Input two numbers:");
    scanf("%d %d", &x, &y);

    maxval = max(&x,&y);
    printf("Max value: %d\n", *maxval);

    return 0;
}      

運作結果:

Input two numbers:5 8
Max value: 8      

3. 總結

繼續閱讀