指针函数和函数指针的区别三分钟弄清函数指针和指针函数函数指针和指针函数用法和区别




指针函数和函数指针的区别三分钟弄清函数指针和指针函数函数指针和指针函数用法和区别

2022-07-21 2:24:15 网络知识 官方管理员

一起来看看函数指针指针函数

初学者看到这里,可能会觉得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;}

指针函数和函数指针的区别(三分钟弄清函数指针和指针函数)(1)

分析定义函数指针的表达式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);

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

指针函数和函数指针的区别(三分钟弄清函数指针和指针函数)(2)

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

  • 把hello当作函数指针时,使用&hello。
  • f是指向函数的指针,通过f调用函数时,使用(*f)(…)。

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

typedefunsignedcharuchar;uchari=0;


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

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

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

指针函数和函数指针的区别(三分钟弄清函数指针和指针函数)(3)

指针函数

似乎又是一个比较陌生的词,不过我们对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等其他类型函数的调用一样,指针函数实在没什么特别的。

指针函数和函数指针的区别(三分钟弄清函数指针和指针函数)(4)

总结

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


发表评论:

最近发表
网站分类
标签列表