C 语言 函数指针
函数中传递函数名,函数名是指向函数的指针,当你创建 myfunc(int arg)
的函数也创建了 myfunc
的指针变量(this save address of function),当调用函数时,你在使用函数指针。
1. 没有函数类型
在 C 中没有函数类型,就不能用 function *
声明函数指针
int *a; // 声明 int 指针 function *f; // error
2. 如何创建函数指针
一个示例代码:
int (*warp_fn)(int); // 创建 warp_fn 变量,保存 func1() 函数的地址 warp_fn = func1; warp_fn(4); // 相当于调用 func1() char** (*name_fn)(char *, int); //name_fn 变量保存函数地址 name_fn = func2; char** results = name_fn("good", 19);
这么复杂的原因:函数返回类型,参数类型要告诉编译器。
char**
: 是一个指针,通常用来指向字符串数组。
2.1 通常的函数调用
void myfunc(int x); // 声明函数, 也可写成:void myfunc(int) int main(int argc, char *argv[]) { myfunc(10); // 函数调用 return 0; } void myfunc(int x) { // 函数定义 printf("%i\n", x); }
2.2 函数指针变量的声明与调用
函数的首地址也以存储在某个函数指针变量里的,就可以通过这个函数指针变量来调用所指向的函数了.
void (*funp)(int); // 声明指向 myfunc 函数的函数指针变量 funp
也可写:
void (*funp)(int x);
关于调用形式,有好几种:
void myfunc(int x); // 声明函数, 也可写成:void myfunc(int) void (*funp)(int); // 声明指向 myfunc 函数的函数指针变量 funp int main(int argc, char *argv[]) { myfunc(10); // 函数调用, 10 funp = &myfunc; // 将 myfunc 地址赋值给 funp, 20 funp(20); funp = myfunc; // myfunc 赋值给 funp, 30 funp(30); (*myfunc)(40); // *myfunc 取值, 40 (*funp)(50); // *funp 取值, 50 return 0; } void myfunc(int x) { // 函数定义 printf("%i\n", x); }
通过这段代码我们可以得出以下结论:
- 1)其实,MyFun 的函数名与 FunP 函数指针都是一样的,即都是函数指针。MyFun 函数名是一个函数指针常量,而 FunP 是一个函数数指针变量,这是它们的关系。
- 2)但函数名调用如果都得如(*MyFun)(10) 这样,那书写与读起来都是不方便和不习惯的。所以 C 语言的设计者们才会设计成又可允许 MyFun(10) 这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
- 3)为统一起见,FunP 函数指针变量也可以 FunP(10) 的形式来调用。
- 4)赋值时,即可 FunP = &MyFun 形式,也可 FunP = MyFun。
2.3 定义函数指针类型
typedef void (*FunType)(int); // 定义一个函数指针类型 FunType funp; // 用 FunType 类型声明全局变量 funp
在 void (*FunType)(int)
前加了一个 typedef
。这样只是定义一个名为 FunType 函数指针类型,而不是一个 FunType 变量。
void myfunc(int x); // 声明函数, 也可写成:void myfunc(int) typedef void (*FunType)(int); // 定义一个函数指针类型 FunType funp; // 用 FunType 类型声明全局变量 funp int main(int argc, char *argv[]) { funp = myfunc; // funp = &myfunc; funp(100); return 0; } void myfunc(int x) { // 函数定义 printf("%i\n", x); }
有了 FunType 类型后,我们就可以同样地、很方便地用 FunType 类型来声明多个同类型的函数指针变量了。如下:
FunType funp; FunType funp2; ...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: C 语言 动态存储
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论