看懂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))[]

,试试读这个答案的含义,验证并加深理解吧

 

posted @ 2019-01-08 09:44  chenlife  阅读(158)  评论(0)    收藏  举报