读懂 函数 + 指针 + 数组
当指针遇到函数、数组,怎么读懂表达式的含义?本文就带你读懂c/c++ 函数、指针、数组表达式。本文原创,转载请注明出处。
优先级简单看
- 表达式提升
()
:一级优先 - 函数
()
:二级优先 - 数组
[]
:二级优先 - 指针定义
*
:三级优先
优先级数越小,优先级越高
c语言运算符机器优先级,看这里
小试牛刀:指针函数 & 函数指针
在看了优先级之后,指针函数和函数指针看起来就很简单了
指针函数:返回值是指针的函数
int *f(int a, int b);
f 先结合 (),说明是个函数,形参是a和b,返回值是指向int的指针。所以 f 是返回指针的函数 —— 指针函数。
注意:返回值是指向数组的指针时,指针函数的写法:
int *f(int a, int b)[];
tips:
可以把指针运算符
*
、标识符和形参列表放在一起,看作是一个新的标识符——代表了指针函数的返回值所指向的变量,那么就变成了int new_f[];
,所以这个函数返回一个指向数组的指针。
函数指针:指向函数的指针
函数(可执行代码)被存储在内存的代码段
text
,了解程序的内存分配 ——> 五个数据段之代码段、数据段、BSS、栈、堆
int (*f)(int a, int b);
因为 *f 被()括住, 优先级最高,f 先结合 *,说明 f 是一个指针。在看 指针指向哪,把 *f 替换成 f1 代表 f 指向的东西,很简单的看出是一个函数。所以 f 是指向指针的函数 —— 函数指针。
看懂这个例子
我们现在试着写一个 指向一个数组的指针p,数组中的每一个元素都是一个函数指针,每个函数都是指针函数,参数为一个int,返回的指针指向一个数组,这个数组的每一个元素都是int
-
先写一个指向数组的指针 p
(*p)[]
因为
*
优先级低于[]
,所以需要用括号提高优先级。 -
再规定这个数组中的元素
- 是一个指针
type *(*p)[] //这里的type是指针指向的类型
在前面直接加上一个
*
,因为*
优先级低于[]
,(*p)
先和[]
结合,再和新增的*
结合* 指向一个函数,参数为一个int ``` type (*(*p)[])(int) //这里的type是函数的返回值类型 ``` 这时需要给上一个步骤的结果套上括号,因为函数定义的优先级高于`*`。如果不加括号,`(*p)[]`将先和`(int)`结合,成为一个函数,非我们所愿
-
再规定返回值
- 是一个指针
type *(*(*p)[])(int)
- 指针指向一个一维数组,数组中的元素是int
int {last_answer}[] || int (*(*(*p)[])(int))[]
这时需要给上一个步骤的结果套上括号,因为
[]
优先级高于*
-
于是我们得到了最终的答案
int (*(*(*p)[])(int))[]
,试试读这个答案的含义,验证并加深理解吧
update at 2017/9/17
by 一颗球