C复习-C语言声明的分析技巧和实例(含指针+数组+函数)

参考:《C专家编程》


C语言声明解读优先级规则

  1. 从最边的标识符(名字)开始,然后按优先级顺序读取
  2. 优先级从高到低依次是:
    a. 声明中被括号括起来的部分
    b. 后缀操作符:()表示这是一个函数,[]表示这是一个数组
    c. 前缀操作符:*表示指向xx的指针
  3. 如果const和(或)volatile后面紧跟类型说明符(如int,long等),那么它作用于类型说明符(即作用右边);其他情况下,const和(或)volatile作用于它左边紧邻的指针星号

规则是参考《C专家编程》,下面实例的解析来自我个人,有问题请指正。

简单举例

int *f(); 
// 从f开始,因为()优先级高于*,所以f是一个函数,返回int指针

int (*f)(); 
// 从f开始,因为和*被括起来了,所以f首先是一个指针。然后是一对括号,表示这个指针指向一个函数
// 这个函数要返回一个int值。因此,f是一个函数指针

int *(*f)(); 
// 类似上面,f是函数指针,但是这次的返回值是一个指向int的指针

int *f[]; 
// []比*的优先级高,所以f首先是一个数组,然后到*,表示数组的元素是指向int的指针

int (*f[])(); 
// []比*的优先级高,所以f首先是一个数组,它的元素的类型是指针;其次是(),表示这些
// 指针是指向返回int的函数。总结: f是一个数组,其元素类型是函数指针,它指向的函数返回值是int

int *(*f[])(); 
// 从f开始,先结合[],所以f是数组。然后是f左侧的*,表示f的元素的类型是指针。随后是()的优先级高于
// 最左侧的*,所以f的元素类型是函数指针,它指向的函数返回指向int的指针

复杂举例

char * const *(*next)();
从左往右第一个变量名是next,next左侧的*表示这是一个指针;
(*next)作为一个整体来看,先结合右侧的(),表示这是一个函数,因此next是一个指向函数的指针;
随后是(*next)左侧的*,表示next指向的函数,返回的是一个指针;
再看const,根据第3条,要结合左侧的指针,因此这个函数返回的指针,指向的是一个类型为char的常量指针
(常量指针就是指向的变量不能变,但是变量本身的值可以变)
总结就是:
next是一个指针,它指向一个函数,该函数返回另一个指针,这个指针指向一个类型为char的常量指针

char *(* c[10])(int **p);
从左往右第一个变量名是c,所以从c开始;
[]的优先级高于*,所以c是一个数组,但是数组元素都是指针;
由于括号出现,因此把(* c[10])看成一个整体,左侧的*优先级低于右侧的括号,所以先结合括号;
因此c[10]的元素的类型是函数指针,它们指向的函数的参数是int **p,返回值是char *

最近更新

  1. TCP协议是安全的吗?

    2023-12-14 08:44:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-14 08:44:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-14 08:44:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-14 08:44:03       18 阅读

热门阅读

  1. 单词统计(C语言)

    2023-12-14 08:44:03       36 阅读
  2. Ray RLlib User Guides:模型,处理器和动作分布

    2023-12-14 08:44:03       45 阅读
  3. BIND9配置及配置文件参数详解

    2023-12-14 08:44:03       37 阅读
  4. vue axios 使用

    2023-12-14 08:44:03       37 阅读
  5. vue项目 实现 vue-schart 图表 resize

    2023-12-14 08:44:03       42 阅读
  6. 精通Nginx(23)-Nginx Plus增强功能之负载均衡

    2023-12-14 08:44:03       34 阅读
  7. shell编程系列(14)-正则表达式详解

    2023-12-14 08:44:03       37 阅读
  8. react Api之createContext

    2023-12-14 08:44:03       35 阅读
  9. MFC(Microsoft Foundation Classes)中 MessageBox

    2023-12-14 08:44:03       37 阅读
  10. 挑战52天学小猪佩奇笔记--day21

    2023-12-14 08:44:03       30 阅读
  11. Linux vdso机制

    2023-12-14 08:44:03       43 阅读
  12. 解决前端跨域问题,后端解决方法

    2023-12-14 08:44:03       41 阅读
  13. Vue2面试题:说一下组件通信有哪些方式?

    2023-12-14 08:44:03       35 阅读