【C】C里符号优先级的那些坑

本文介绍了C语言中符号优先级的问题,特别是指针与数组的结合以及函数声明时的运算符优先级。强调了'[]'的优先级高于'*',并通过示例解释了如何解析复杂的表达式,如指针数组和函数指针。同时,提供了C语言运算符优先级表的参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【C】C里符号优先级的那些坑

最近准备在准备公司里的底层软件技能鉴定,作为每次面试笔试必考的坑,感觉很有必要好好复习一遍。
常见的有这几种坑:

指针与数组

这里要提到一种层层解析的方法。
1、先从最简单的开始

int *pf;

首先应该理解一下,“*”这个符号应该理解为“解地址”,即将地址转换成对应的数据。
这个例子暂时不用考虑优先级的事,所以含义是:
* pf解地址后是int类型 –> pf就是int的指针

int pf[3];

然后理解“[]‘这个符号,应该是对变量进行地址偏移运算,比如pf[3]应该就是pf偏移3个单位后的地址。
所以这个例子可以这么理解
* pf偏移0/1/2个单位时都是int类型 –> pf就是大小为3的int数组

2、*与[]
当两个东西组合起来,事情就变得复杂了,首先应该记住,“[]”的优先级比”*”高

int *pf[3];

这个例子,pf应该与“[]”先结合后再与“*”结合,所以可以看成

int *(pf[3]);

再按照上一个例子中的层层解析
* (pf[])解地址后是int类型 –> (pf[])就是int的指针
* pf进行偏移0/1/2个单位运算后仍然是int的指针 –> pf就是大小为3的int的指针数组

同理

int (*pf)[3];

这个例子可以这么理解
* (*pf)进行偏移0/1/2个单位运算后仍然是int类型 –> (*pf)就是大小为3的int数组
* pf解地址后是大小为3的int数组 –> pf就是指向大小为3的int数组的数组指针

函数声明

在有了上面的基础后,现在把表达式再弄复杂点,我们要声明函数了。

int *g();

函数最基本的特征就是有“()”。
“()”优先级与”[]“在同一级别,都比”*“高。
所以同样的方法
* g()解地址后是int类型 –> g()就是指向int类型的指针
* g函数执行后结果为指向int类型的指针 –> g就是返回指向int类型指针的函数
是不是很简单?

那么我们继续

int (*g)();

继续分析
* (*g)函数执行结果为int类型 –> (*g)就是返回int类型的函数
* g解地址后是返回int类型的函数 –> g就是指向返回int类型的函数的函数指针

是不是感觉有点boring了?
最后,来个复杂点的

(((void*)())0)();

请解析这个吧~

附:C语言运算符优先级表

C语言优先级

参考:
https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin
《C陷阱与缺陷》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值