看懂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
1.先写一个指向数组的指针 p
(*p)[]
因为*优先级低于[],所以需要用括号提高优先级。
2.再规定这个数组中的元素
- 是一个指针
-
type *(*p)[] //这里的type是指针指向的类型
在前面直接加上一个
*,因为*优先级低于[],(*p)先和[]结合,再和新增的*结合
* 指向一个函数,参数为一个int ``` type (*(*p)[])(int) //这里的type是函数的返回值类型 ``` 这时需要给上一个步骤的结果套上括号,因为函数定义的优先级高于`*`。如果不加括号,`(*p)[]`将先和`(int)`结合,成为一个函数,非我们所愿
3.再规定返回值
-
- 是一个指针
type *(*(*p)[])(int)
- 指针指向一个一维数组,数组中的元素是int
int {last_answer}[] || int (*(*(*p)[])(int))[]
这时需要给上一个步骤的结果套上括号,因为[]优先级高于*
4.于是我们得到了最终的答案
int (*(*(*p)[])(int))[]
,试试读这个答案的含义,验证并加深理解吧

浙公网安备 33010602011771号