【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)();
请解析这个吧~