函数指针

来源:互联网 发布:神奇公式优化 编辑:程序博客网 时间:2024/05/18 01:05

前言

c语言有复杂的指针声明,都是由各种声明嵌套构成的。各大公司的笔试题里经常会出现理解复杂指针声明,右左法则是一个著名又常用的方法。参考的原文链接:http://blog.sina.com.cn/s/blog_645508ba0100knkp.html

右左法则

The right-left rule : start reading the declaration from the innermost parentheses, go rigtht, and then go left. when you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

右左规则:首先从最里面的括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

原文作者对这里进行了修正:应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里可能有多个标识符,但未定义的标识符只会有一个

示例

int (*func) (int *p);

首先找到未定义标识符,就是func,它的外面有一对圆括号,而且左边是一个*,这说明func是一个指针。然后跳出括号,看右边,也是一个括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,也就是一个函数指针。这类函数具有int*类型的参数,返回值类型是int

int (*func)(int *p, int (*f)(int *));

func被一对括号包含,且左边有一个*号,说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,说明func是一个函数指针。这类函数具有int *和 int (*)(int *)这样的形参,返回值是int。对于int (*f)(int *)的形参,分析方法跟func是一致的

int (*func[5])(int *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符的优先级比*高,func先跟[]结合,因此*修饰的是func[5].跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型是int

int (*(*func)[5])(int *p);

func被一对圆括号包围,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,向右看,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针具有int *形参,返回值为int类型的函数

int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int *类型的形参,返回值是指向数组的指针,所指向的是具有5个int类型元素的数组。