存档

文章标签 ‘c函数指针’

c语言函数指针

2016年10月18日 没有评论

最近在学习nginx相关的内容,看书上介绍nginx的源码,里面很多地方都用到了函数指针。对于我这种c语言菜鸟来说,看的是云里雾里的,搞不清楚要干嘛,就搜索了一些函数指针的内容,自己动手实验了一番。

在C系列语言中,任何一个变量,总是要先声明,之后才能使用的,这和php差别还是很大的。函数指针的声明可以按照如下”返回类型 (*变量名)(函数参数…)“进行,下面我来举几个例子。


void (*my_func1)(void);  //声明一个返回类型为空,参数为空,名字为my_func1的函数指针

int (*my_func2)(int x,int y);  //声明一个返回类型为整形,参数为整形x和整形y,名字为my_func2的函数指针

int (*my_func3)(int,int);   //声明一个返回类型为整形,参数为2个整形,名字为my_func3的函数指针,其实和上面的my_func2一样

void (*my_func4)(char *str);  //声明一个返回类型为空,参数为字符指针,名字为my_func4的函数指针

typedef void (*void_func_t)(void);  //typedef关键字是类型定义,这里就是定义了一个返回值为空,参数为空的函数指针类型,类型名称为void_func_t

相信经过上面的例子,对c语言的函数指针大家都有一个初步的概念,看了下面的代码相信大家基本都能初步掌握函数指针了.

文件名:main.c


#include <stdio.h>

//定义返回值为int,传入参数为2个int的函数指针
int (*point_func)(int,int);
int (*p_func)(int a,int b);
//定义返回值为int,传入参数为2个int的函数指针类型
typedef int (*sum_func)(int,int);

/**
 * 定义一个相加函数
 */
int sum(int x,int y){
 int r = x+y;
 printf("%d+%d=%d\n",x,y,r);
 return r;
}
//执行传入进去的函数
void exec_func(sum_func do_func){
 do_func(10,21);
}

int main() {
 int result;
 sum_func my_func;

my_func = sum;
 result = sum(1,2);
 point_func = &sum;
 p_func=point_func;
 //通过指针的方式调用函数
 (*point_func)(3,4);
 (*p_func)(5,6);
 p_func(7,8);
 exec_func(my_func);
 exec_func(point_func);
 return 0;
}


上面代码中我们既可以通过”(*p_func)(5,6)”也可以直接通过”p_func(7,8)”直接调用,前者是比较正规的写法,但是阅读起来是不是没有后者那么舒服顺畅。

编译上面代码”gcc main.c -o main”,执行代码就可以看到下面的输出结果:


1+2=3
3+4=7
5+6=11
7+8=15
10+21=31
10+21=31