C语言中有数组指针和指针数组 , 现在又有函数指针和指针函数,初学者看到这里,可能会觉得C语言是一门喜欢咬文嚼字的编程语言 。其实我也比较讨厌术语,因为它们总是能够加大初学者接受相关知识的难度 。

不过话说回来,如果能够理解和掌握C语言指针的基本知识,哪怕第一次听说这些术语,应该也是能够理解其含义的,甚至,自己自然而然的也会这么称呼它们 。
函数指针
我们先回顾下数组指针和指针数组,题主可看看我之前的解答或者文章,应该会发现只要把“数组”像“int”一样看作是一种数据类型,数组指针和指针数组就具有很明显的区别了 。

int 指针是指向 int 型数据 , 那数组指针就指向数组的指针 。int 数组是一个存放 int 数据的数组 , 那指针数组就是存放指针的数组 。在C语言中 , 函数也是一种类型,那函数指针就是指向函数的指针 。
函数指针怎么定义呢?请看下面这个例子:

分析定义函数指针的表达式 void (* f )(char * ) 和分析数组指针的定义方式是相似的,() 的优先级高 , 所以 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 地址打印出来,请看:


不过,使用函数指针时,有些程序员更习惯下面这么用,这样一眼就能看出使用的是函数指针,当然 , 究竟使用哪种主要取决于个人习惯 。
- 把 hello 当作函数指针时,使用 &hello 。
- f 是指向函数的指针,通过 f 调用函数时,使用 (* f)(…) 。

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

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

指针函数
似乎又是一个比较陌生的词,不过相信题主对 int 函数还是挺熟悉的,int 函数是返回 int 数据的函数,那指针函数就是返回指针的函数 。、就这么简单 。下面给出一个指针函数的使用实例,请看相关C语言代码:

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

总结
指针函数是一个函数,它的返回值是指针类型 。函数指针是一个指针,它指向函数,通过函数指针可以调用它指向的函数,通过函数指针,我们可以让C语言仿 C++ 实现“类”的封装,题主可参考我相关的文章 。

欢迎在评论区一起讨论,质疑 。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦 。
函数指针和指针函数的区别:
1. 名字解析 。这两个名词都是带有修饰的名词 , 可以略微扩展一下 , 在中间加个助词’的’,函数的指针和指针的函数;现在看看,稍微清晰了一点,现在再扩展一下 , 加点修饰词–指向函数的指针和返回值为指针的函数;现在基本明确了 。
2. 格式 。
Type (* pFunc)(Type para); — 函数指针
Type* Func(Type para); — 指针函数
3. 先说指针函数 , 其实它就是普通函数,只不过返回值是指针(其实就是地址)而已,很多人因为恐惧指针,觉得它神秘!
4. 函数指针 。这个有点复杂,首先*和pFunc先结合,优先级最高 , 因此pFunc就是指针了,同时这个指针后面带走一对小括号,里面还有参数,和函数的参数是一样的格式,因此这个指针就是函数指针,这个指针前面还有个类型-返回值类型!有人这里感觉很奇怪,指针怎么有返回值呢?
5. 指针有返回值 , 是因为这个指针讲来使用的时候,会指向一个格式和它自己类似的函数,因此这个指针的返回值和参数格式就决定了指向的函数的格式!
【c语言指针函数和函数指针的区别】
6. 函数指针要熟练,没有为啥,必须会 , 因为函数指针使用的时候体现的是C语言中的联编特点,也是后来C++语言中多态的雏形!