指针函数

指针函数是指返回类型为函数指针类型

function函数返回一个返回值为空,参数值为int类型的函数指针。

1
void (*fun)(int) funtion();

函数指针

函数指针:指向函数入口的指针

函数指针的定义

函数返回值 (*point)(参数类型);

1
int (*FUNC_POINT)(float);

上面代码声明了一个返回值为int,参数类型为float的函数指针

typedef与函数指针

1
2
typedef int(*func)(int) FUNC;
FUNC f1;//得到函数指针 int(*f1)(int)

函数指针的初始化

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int add(int x,int y){
printf("%d+%d=%d\n",x,y,x+y);
}
int main(){
int (*func)(int,int);
func=add;
func(1,2);
}
1
2
3
4
5
6
7
8
9
#include<stdio.h>
int add(int x,int y){
printf("%d+%d=%d\n",x,y,x+y);
}
int main(){
int (*func)(int,int);
func=add;
func(1,2);
}

函数指针数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>

int add(int x,int y){
printf("%d+%d=%d\n",x,y,x+y);
}
int sub(int x,int y){
printf("%d-%d=%d\n",x,y,x-y);
}
int main(){
int (*func[2])(int,int)={add,sub};
for(int i=0;i<2;i++){
func[i](5,4);
}
}

数组func中存放着函数指针变量add和sub

函数指针作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
void success(void){
printf("sucess\n");
}

void error(void){
printf("error\n");
}
void function(void (*func)(void)){
func();
}

int main(){
function(success);
function(error);
}

函数指针可以作为回调函数使用,让函数调用不同的函数

结构体中使用函数指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#define num 5
struct Grade{
float (*get_avg_score)(int []);
};
float get_avg_score(int arr[]){
int sum=0;
float avg=0;
for(int i=0;i<num;i++){
sum+=arr[i];
}
avg=sum*1.0/num;
printf("%f\n",avg);
return avg;
}
int main(){
struct Grade MyGrade;
float avg;
int source[num];
for(int i=0;i<num;i++){
source[i]=i*10;
}
MyGrade.get_avg_score=get_avg_score;
avg=MyGrade.get_avg_score(source);
return 0;
}

结构体中并不能直接定义函数,但可以定义函数指针,在结构体初始化时可以把功能函数的地址赋给函数指针,达到结构体成员为函数的功能。