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

参考:《C专家编程》


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

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

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

简单举例

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的指针

复杂举例

c 复制代码
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 *。
相关推荐
卢锡荣4 分钟前
Type-C口电子产品离不开的C口逻辑专用控制芯片介绍
c语言·开发语言
顶点多余7 分钟前
算法哪些事儿---2
java·开发语言
方知我8 分钟前
NumPy一小时速成
开发语言·python·numpy
OPEN-F35 分钟前
C++综合实战:面向对象图书管理系统
开发语言·c++
ttwuai1 小时前
Go 后台清空操作日志失败,权限和无 WHERE 删除怎么排查?
开发语言·后端·golang
西西弗Sisyphus1 小时前
Qt 在无边框窗口上做一套换肤系统
开发语言·数据库·qt
西西弗Sisyphus1 小时前
Qt 启动 UsageStatistic 插件报错
开发语言·qt
NeoGressAI外贸数字化1 小时前
外贸独立站零询盘排查:从 Google Search Console 到 PageSpeed 的技术实操
开发语言·c++
无小道1 小时前
C/C++——异步编程小记
开发语言·c++·c++11
奇树谦1 小时前
Pimpl 模式(d-pointer)详解:如何解决 C++ 头文件过大、编译依赖和 ABI 兼容问题
开发语言·c++