C语言指针的阅读技巧分析

指针是学习C语言学习的重点,是C语言的灵魂。在一些面试题里面经常会遇到一些问题,比如问下面的标识符代表什么含义?
    int (*p1)(int*, int(*f)(int*));
    int (*p2[5])(int*);
    int (*(*p3)[5])(int*);
    int*(*(*p4)(int*))(int*);
    int (*(*p5)(int*))[5];
乍一看可能一脸蒙蔽,没事,本篇文章就是想教会大家如何阅读这些指针的。
下面先给出一个指针的阅读法则,有了这个法则阅读上面的指针将会很简单。它的名字就是:**右左法则**。
什么是右左法则呢?
**右左法则:**
**Step1:**从最里层的圆括号中未定义的标识符看起;
**Step2:**首先往右看,再往左看;
**Step3:**遇到圆括号或方括号时可以确定部分类型,并调转方向;
**Step4**:重复Step2、Step3,直到阅读结束。
好的,通过右左法则,就可以很轻易地解读上面的标识符。

右左法则使用:
首先举一个例子给出这个法则的使用方法:

int(*p)(int); 

解析:首先看p,根据右左法则先向右看,看到了圆括号),这时调转方向看p的左边,p的左边是*号,确定p为指针,那么p为什么样的指针呢?于是继续向左边看,看到了圆括号(,调转方向向右边看。此时看到了圆括号(,这时候就可以确定p是指向函数的指针。那么指向的函数是什么样子的呢?向右边看是一个int,那么这个函数的参数是int,继续向右看,看到了圆括号)。 At this time, we have parsed the right half part. 看到圆括号之后调转方向,看最左侧剩下的是什么呢?剩下的是一个int,我们知道,p指针指向的函数的返回值是int

梳理一下,就是上面加粗的部分:p为指针 => 指向函数 => 函数的参数是int,返回值是int。这就解析完毕了,p也就是我们常说的函数指针

小试牛刀之后,下面正式解决上面的5个问题。
Question1:

int (*p1)(int*, int(*f)(int*));

解析:(右左法则在心中哦!)
首先看到p1为一个指针,那么此时已经解析了(p1),往右边看,看到了圆括号(,我们知道p1指向的是一个函数,函数的第一个参数是int,第二个参数是int(*f)(int*),这个和我们上面举的小例子十分相似。可以看出,第二个参数是一个函数指针,指向的函数参数是int*,返回值是int。p1右侧部分部分已经解析完毕,左侧的int就是p1指向的函数的返回值,返回值为int

Question2:

int (*p2[5])(int*);

解析:首先看p2,往右侧看是[5],知道p2是一个数组数组里有5个元素,那么继续往右侧看是圆括号),调转方向,看左边是星号,那么这5个元素是指针。是什么指针呢?继续往右侧看是指向参数为int*,返回值为int的函数

继续来:
Question3:

int (*(*p3)[5])(int*);

解析:p3是一个指针,指向的是什么呢?往右侧看是[5],那么p3就是一个数组指针,这个数组里有5个元素。继续往右看,看到了圆括号),那么调转方向看左侧,左边是一个号,那么这5个元素就是指针了。((*p3)[5])已经解析完毕了。既然这5个元素为指针,那么是什么类型的指针呢?向右侧看是 int星,最左侧是int。很明显,这5个元素是指向函数的指针,函数的参数类型是int星,返回值是int。

Question4:

int*(*(*p4)(int*))(int*);

解析:有了上面的4个小例子,下面就不一步一步分析了。
==> p4为指针 => 是一个函数指针 => 函数的参数是int* => 返回值是一个*,说明返回值是一个指针 => 这个指针指向的函数类型是int星(int星)

Question5:

int (*(*p5)(int*))[5];

解析:
==> p5为指针 ==> 函数指针 ==> 函数的参数为int* => 函数的返回值也是指针,指向了一个数组 => 数组的类型是int[5]。

为了简化阅读,可以使用typedef
比如上面的p5:

typedef int(ArrayType)[5];
typedef ArrayType*(FuncType)(int*);
FuncType* p5;

掌握了右左法则,一切指针分析都是纸老虎。使用这个法则,可以从里到外,由右向左一步一步剥离复杂的指针表达式。

以上内容可以参考狄泰软件学院的C语言进阶剖析教程,教程主讲人是摩托罗拉公司的架构师唐老师。唐老师分析问题一针见血不拖泥带水。如果想增加自己的C语言功底,可以买来看看。100多块钱,大冬天的请女朋友吃顿火锅都不够,对于刚学C语言的同学,学完之后将受益良多少走弯路。这也是我写最后这一段话的最主要的原因。QQ入口群:199546072。
淘宝店地址:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-16326486341.29.57aeceb6Fxlrqp&id=557465872788,详细问题可以问客服。

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值