前几天在佛科大,惊闻某为同学学习指针学了一年,且未的要领!我当时除了深深吃了一斤之外,瞬间觉得自己的工作是如此的重要和迫切!对于指针这类调皮鬼,今天来聊聊函数指针这个特殊的一员。
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');
最终结论:函数名就是函数指针,使用这种指针可以跟普通指针完全一样,取址、解引用。但是他们又有特殊待遇,可以不用取址符,也不用解引用符。