1. 定义
c语言中的的函数在汇编之后会变成一个个代码段,函数的名称实际上是指代了代码段的开头内存地址,所以函数名本身就是函数指针,我们现在想定义一个函数指针变量来指向函数,从而调用函数,也就是在线程中来开辟不同的线程
2. 使用
2.1 定义函数指针变量,变量名是function
void (*function)(void *args, int a);
组成:这就是在定义一个函数指针变量,变量名是function,变量的属性是,该指针指向一个返回值是void,形参是void* 和int的函数
注:我们定义的函数指针不可以指向返回值不同,形参不同的函数(不可以进行赋值,必须赋值一个形参类型和返回值都相同的函数)
2.2 使用变量,指向函数
function = func;
此时,我们事先声明了函数func,直接进行赋值
2.3 通过函数指针直接调用函数
(*function)(args, a);
此时我们就通过函数指针变量调用了函数
3. 函数
我们定义了函数func,我们在使用该函数的时候使用
func(args, a);
的形式;同时我们还可以使用:
(*func)(args, a);
可见,函数名就是函数指针
4. 将函数指针作为函数的形参进行传递
//定义函数
void function2(char *string) {
printf("function2:%s\n", string);
}
int function4(void (*function)(char *), char *argv) {
(*function)(argv);
return 0;
}
//调用
int main(void) {
int (*f4)(void (*)(char *), char *);
//等同于:int (*f4)(void (*function)(char *argv), char *argv)
f4 = function4;
(*f4)(function2, "hey");
return 0;
}
可见在我们定义函数的时候,如果我们的形参名是不用的情况下,是可以不写出来的,指定类型即可;同时在定义函数指针变量的时候,我们使用了int (*f4)(void (*)(char*), char *)这种不加变量名只指定类型的形式是可用的
5.实践
#include <stdio.h>
void function1(void) {
printf("function:1\n");
}
void function2(char *string) {
printf("function2:%s\n", string);
}
int function3(void) {
printf("function3:\n");
return 0;
}
int function4(void (*function)(char *), char *argv) {
(*function)(argv);
return 0;
}
int main(void) {
void (*f1)(void);
void (*f2)(char *string);
int (*f3)(void);
int (*f4)(void (*function)(char *argv), char *argv);
f1 = function1;
f2 = function2;
f3 = function3;
f4 = function4;
(*f1)();
(*f2)("nihao");
printf("%d\n", (*f3)());
(*function1)();
function1();
(*f4)(function2, "hey");
return 0;
}
编译执行:
root@ubuntu:~/new_step/test/c/lang# gcc -o point_func_test point_func_test.c -Wall
root@ubuntu:~/new_step/test/c/lang# ./point_func_test
function:1
function2:nihao
function3:
0
function:1
function:1
function2:hey