知乐空间

指针函数和函数指针的区别(指针函数)

指针函数(指针函数和函数指针之间的区别)

在第22节中,我们找出了中数组指针和指针数组的区别和联系。现在,趁热打铁,让我们一起来看看函数指针和指针函数。

初学者看到这里,可能会觉得 C 语言是一门喜欢咬文嚼字的编程语言,其实弄懂了,你自然也会这么称呼它们的。

函数指针

回想第22节,只要我们把“数组”看作像“int”一样的数据类型,数组指针和指针数组就有明显的区别。int指针指向int数据,数组指针指向数组指针。int数组是存储int数据的数组,指针数组是存储指针的数组。在C语言中,函数也是一种类型,函数指针就是指向函数的指针。

如何定义函数指针?请看下面的例子:

#include void hello(char* name){ printf("hello, %s\n", name);}int main(){ void (*f)(char *) = hello; f("Jim"); return 0;}

定义分析函数指针的表达式void (* f )(char *)类似于第22节中分析数组指针的定义。()优先级高,所以F先和*组合,所以F先是指针。是什么类型的?out * f是函数原型的格式,char*作为参数,void作为返回值,所以f是函数类型的指针。而hello函数恰好有char*作为参数,void作为返回值,所以函数指针F可以指向hello。也可以写成:

void (*f)(char *) =&hello;

也可以通过函数指针来调用它所指向的函数,比如上面的F(“Jim”),也可以用(* F)(“Jim”)的形式来调用。需要注意的是,单独写f时,是函数指针,没有函数调用。要调用函数,需要添加一个“()”符号。

可以把 “()”理解为函数调用的运算符,它的左侧要求是函数指针。

初学者看到这个可能会有一些疑问,比如为什么初始化F的时候可以直接给F分配hello或者&hello给F?比如为什么可以直接用f ("Jim ")或者(* f) ("Jim ")来调用函数?其实我们做个实验就明白了。让我们打印出来&你好,你好,*你好地址。请参见:

printf("&hello: %p\n", &hello);printf(" hello: %p\n", hello);printf("*hello: %p\n", *hello);

编译后,你会发现三者实际上是相等的,所以虽然上面描述的用法略有不同,但程序可以正常工作。

但是,在使用函数指针时,有些程序员更习惯于如下使用,这样他们一眼就能看出自己在使用函数指针。当然,用哪一个主要看个人习惯。

当使用hello作为函数指针时,使用&hello。

f是指向函数的指针。通过F调用函数时,使用(* f)(…)。

好了,现在我知道如何使用函数指针了。然而,中函数指针的定义有点繁琐。如果要定义同类型的多个函数,就要写很多重复的代码。这不是“不优雅”吗?事实上,我们应该尽最大努力避免代码重复。幸运的是,C语言中有typedef关键字。

typedef unsigned char uchar;uchar i = 0;

Typedef关键字使我们能够使用其他符号来代替繁琐的数据类型。例如,在上面的代码中,我们使用了uchar符号而不是“无符号字符”类型。如果我们将来想定义一个无符号char类型的变量,我们可以直接使用uchar。在上面的例子中,我们使用uchar定义了一个无符号字符类型的变量I。函数的定义也可以通过typedef关键字来简化:

typedef void (*FUN)(char *);FUN f = &hello;(*f)("Jim");

我们用FUN符号代替函数指针类型。这个函数的参数类型是char*并且返回值是void。以后遇到这种类型的函数,可以使用FUN符号直接定义对应的函数指针。

指针函数

这似乎又是一个奇怪的词,但我们对int函数相当熟悉。int函数是一个返回int数据的函数。相比之下,指针函数是一个返回指针的函数。就这么简单?是的,就这么简单。这里有一个使用指针函数的例子。请参见:

#include char *str1 = "hello, i am Jim\n";char *str2 = "hello, i am Tom\n";char *get_str(){ static char i = 0; if((i ++)%2) return str1; else return str2;}int main(){ printf("%s", get_str()); printf("%s", get_str()); return 0;}

get_str函数的返回值是char指针类型,所以get_str是一个指针函数。它的调用方式与其他类型的函数(如int)相同。指针功能真的没什么特别的。

摘要

指针函数是一个返回值为指针类型的函数。函数指针是指向函数的指针。通过函数指针,可以调用它所指向的函数。通过函数指针,我们可以让C语言模仿C++实现“类”的封装,接下来会介绍。

欢迎在评论区一起讨论和提问。文章都是手工原创,每天用最简单的方式介绍C语言。如果你喜欢我的文章,关注一波,就能看到最新的更新和以前的文章。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@xxxxxxxx@hotmail.com 举报,一经查实,立刻删除。

留言与评论(共有 0 条评论)
验证码: