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

/ 0评 / 0

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

在第22节,我们弄清了数组指针和指针数组的差别和接洽,现在趁热打铁,一起来看看函数指针和指针函数。

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

函数指针

回忆一下 22 节,我们只要把“数组”像“int”一样看作是一种数据类型,数组指针和指针数组就具有很显著的差别了。int 指针是指向 int 型数据,那数组指针就指向数组的指针。int 数组是一个寄存 int 数据的数组,那指针数组就是寄存指针的数组。在 C 语言中,函数也是一种类型,那函数指针就是指向函数的指针。

函数指针怎么定义呢?请看下面这个例子:

#include<stdio.h>voidhello(char*name){printf("hello,%s\n",name);}intmain(){void(*f)(char*)=hello;f("Jim");return0;}

剖析定义函数指针的表达式 void (* f )(char * ) 和第22节剖析数组指针的定义方法是类似的,() 的优先级高,所以 f 先和 * 联合,因此 f 首先是一个指针,什么类型呢?* f 外面是一个函数原型的格局,参数是 char* ,返回值是 void,所以 f 是一个函数类型的指针。而 hello 函数恰好参数是 char* 类型,返回值是 void 类型,因此可以让函数指针f 指向 hello。也能写成:

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

通过函数指针也能调用它指向的函数,例如上面的 f(“Jim”),也可以以 (* f)(“Jim”) 的情势调用。应当注意到了,单独写 f 的时候,它是一个函数指针,并没有函数调用。想调用函数,须要加上“()”符号。

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

初学者看到这里,可能有些疑问,例如为什么初始化 f 时百思特网,既可以把 hello 直接赋值给 f,也可以把 &hello 赋值给 f?再例如,为什么通过 f 调用函数时,既可以直接 f(“Jim”),也可以 (* f)(“Jim”)?其实做个实验就明确了,我们把 &hello,hello,* hello 地址打印出来,请看:

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

编译履行,会发明其实这三者是相等的,所以上面介绍的应用方法虽然略有不同,程序也可以正常工作。

不过,应用函数指针时,有些程序员更习惯下面这么用,这样一眼就能看出应用的是函数指针,当然,毕竟应用哪种重要取决于个人习惯。

好了,现在知道怎么应用函数指针了,只是,函数指针的定义方法有些繁琐,如果我想定义多个同样类型的函数,要写好多反复代码,这不是“不优雅”吗?的确,应当尽量避免反复代码,好在 C 语言有 typedef 症结字。

typedefunsignedcharuchar;uchari=0;

typedef 症结字使得我们可以用其他符号取代较繁琐的数据类型,例如上例代码,我们应用 uchar 符号取代了 “unsigned char”类型,以后想定义 unsigned char 类型的变量,直接用 uchar 就可以了,在上例中,我们用 uchar 定义了一个 unsigned char 类型的变量 i。函数指针的定义方法也可以用 typedef 症结词简化:

typedefvoid(*FUN)(char*);FUNf=&hello;(*f)("Jim");

我们应用 FUN 符号取代了函数指针类型,这种函数的参数类型为 char* ,返回值为 void。以后遇到这种类型的函数,直接应用 FUN 符号就可以定义出对应的函数指针。

指针函数

似乎又是一个比拟生疏的词,不过我们对 int 函数还是挺熟习的,int 函数是返回 int 数据的函数,比较一下,那指针函数就是返回指针的函数。就这么简略?是的,就这么简略。下面给出一个指针函数的应用实例,请看:

#include<stdio.h>char*str1="hello,iamJim\n";char*str2="hello,iamTom\n";char*get_str(){staticchari=0;if((i++)%2)returnstr1;elsereturnstr2;}intmain(){printf("%s",get_str()百思特网);printf("%s",get_str());return0;}

get_str 函数返回值是 char 指针类型的,所以 get_str 是一个指针函数。它的调用方法和 int 等其他类型函数的调用一样,指针函数实在没什么特殊的。

总结

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

欢百思特网迎在评论区一起讨论,质疑。文章都是手打原(原创www.isoyu.com版权)创,每天最浅易的介绍C语言,爱好我的文章就关注一波吧,可以看到最新更新和之前的文章哦