C语言(函数指针)

前几天在佛科大,惊闻某为同学学习指针学了一年,且未的要领!我当时除了深深吃了一斤之外,瞬间觉得自己的工作是如此的重要和迫切!对于指针这类调皮鬼,今天来聊聊函数指针这个特殊的一员。

C语言中,指针是一类变量,可以有指向int的指针,可以有指向float的指针,可以有指向结构体的指针,还有一类非常重要的:指向函数的指针。

比如有如下函数:

void function(int a, char b) { ... ... }

函数是什么?将以上C语言源代码编译,生成汇编文件给你看看什么“函数”

look:

注意到第5行,显然函数 function 就是一个标签,就是其所包含的函数体代码块的入口,就是函数体第一行代码的地址。看出来了吧,对!函数就是地址。

因此,function就是一个指针,一个指向其本身函数体第一行的指针。所以当我们想要定义一个指针指向这个函数的时候,就可以这么写:

void (*p)(int a, char b) = function;

此时,p跟fucntion就是一样的。那么我们怎么去调用这个函数呢?look:

function(100, 'x'); p(100, 'x');

可见,函数名就是指针,用起来是完全一样的。

当然,C语言为了让初学者不至于懵圈,发出这样的疑问:

“咦!?既然是指针,赋值怎么不需要取址? 取目标怎么不需要解引用?”

甭着急,你完全可以这么写:

void (*p)(int a, char b) = &function; function(100, 'x'); (*p)(100, 'x');

最终结论:函数名就是函数指针,使用这种指针可以跟普通指针完全一样,取址、解引用。但是他们又有特殊待遇,可以不用取址符,也不用解引用符。

原文发布于微信公众号 - 秘籍酷(mijiku040)

原文发表时间:2019-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券