这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:
A)
char * (*fun1)(char * p1,char * p2);
B)
char * *fun2(char * p1,char * p2);
C)
char * fun3(char * p1,char * p2);
看看上面三个表达式分别是什么意思?
C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型。
B) 也很简单,与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
A) fun1是函数名吗?回忆一下前面讲解数组指针时的情形。我们说数组指针这么定义或许更清晰:
int (*)[10] p;
再看看A)表达式与这里何其相似!明白了吧。这里fun1不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。同样,我们把这个表达式改写一下:
char * (*)(char * p1,char * p2) fun1;
这样子是不是好看一些呢?只可惜编译器不这么想。^_^。
函数指针和一个简单的函数
我们从一个非常简单的”Hello World“函数入手,来见识一下怎样创建一个函数指针。
#include // 函数原型 void sayHello(); //函数实现 void sayHello(){ printf("hello world\n"); } // main函数调用 int main() { sayHello(); }
我们定义了一个名为sayHello的函数,它没有返回值也不接受任何参数。当我们在main函数中调用它的时候,它向屏幕输出出”hello world“。非常简单。接下来,我们改写一下main函数,之前直接调用的sayHello函数,现在改用函数指针来调用它。
int main() { void (*sayHelloPtr)() = sayHello; (*sayHelloPtr)(<a style="color:transparent">来源gao($daima.com搞@代@#码(网</a>); }
第二行void (*sayHelloPtr)()的语法看起来有些奇怪,我们来一步一步分析。
这里,关键字void的作用是说我们创建了一个函数指针,并让它指向了一个返回void(也就是没有返回值)的函数。
就像其他任何指针都必须有一个名称一样,这里sayHelloPtr被当作这个函数指针的名称。
我们用*符号来表示这是一个指针,这跟声明一个指向整数或者字符的指针没有任何区别。
*sayHelloPtr两端的括号是必须的,否则,上述声明变成void *sayHelloPtr(),*会优先跟void结合,变成了一个返回指向void的指针的普通函数的声明。因此,函数指针声明的时候不要忘记加上括号,这非常关键。
参数列表紧跟在指针名之后,这个例子中由于没有参数,所以是一对空括号()。
将上述要点结合起来,void (*syaHelloPtr)()的意义就非常清楚了,这是一个函数指针,它指向一个不接收参数且没有返回值的函数。
在上面的第二行代码,即void (*sayHelloPtr)() = sayHello;,我们将sayHello这个函数名赋给了我们新建的函数指针。关于函数名的更多前端的相关知识:其一,函数名会被隐式的转换为函数指针,就像作为参数传递的时候,数组名被隐式的转换为指针一样。在函数指针被要求当作输入的任何地方,都能够使用函数名。其二,解引用符*和取地址符&用在函数名之前基本上都是多余的。
以上就是C语言中的函数指针基础学习教程的详细内容,更多请关注gaodaima搞代码网其它相关文章!