zoukankan      html  css  js  c++  java
  • 看懂c/c++ 函数、指针、数组表达式

    读懂 函数 + 指针 + 数组

    当指针遇到函数、数组,怎么读懂表达式的含义?本文就带你读懂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))[],试试读这个答案的含义,验证并加深理解吧

    update at 2017/9/17
    by 一颗球

  • 相关阅读:
    [安全相关]SQL注入
    [android] service基础
    [android] activity基础
    [javascript] 基础积累
    [CSS] 常用积累
    html & css
    时序图和活动图
    分析图书馆管理系统的5W1H
    风险分析
    PM案例分析(团队作业第三组)
  • 原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/7536413.html
Copyright © 2011-2022 走看看