作者:柒号華仔
個人首頁:歡迎通路我的首頁
個人信條:星光不問趕路人,歲月不負有心人。
個人方向:主要方向為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