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 *。
相关推荐
我命由我1234527 分钟前
Android 广播 - 组件通信
android·java·开发语言·android studio·android jetpack·android-studio·android runtime
前端 贾公子29 分钟前
LangGraph == 图的状态(State)管理 (中)
开发语言·数据库·python
李福春42 分钟前
斗破Google ADK Java苍穹-第2境斗者-凝旋筑基-Java环境
java·开发语言·gemini·llmagent·深圳同盟·腾讯云架构师技术同盟·adk java
老王爱玩车1 小时前
预处理详解
c语言·开发语言·学习
灯澜忆梦1 小时前
【Go Zap 日志库】#1 |快速上手 + 配置详解
开发语言·后端·golang
a努力。2 小时前
四维解析Agent记忆架构:从零实战LangGraph长期记忆
java·开发语言·数据库
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker
niucloud-admin2 小时前
JAVA V6 多商户商城 开发文档——项目启动
java·开发语言·python
学逆向的2 小时前
C 控制台指令
c语言·开发语言·网络安全
沫璃染墨2 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书