博客
关于我
复杂指针解析
阅读量:543 次
发布时间:2019-03-09

本文共 1530 字,大约阅读时间需要 5 分钟。

复杂指针解析

右左法则是理解复杂指针声明的有效方法。右左法则的核心在于从最里面的括号开始,然后依次向右和向左查看,遇到括号时改变阅读方向。当解析完一个括号内的所有内容后,就跳出该括号,继续重复这个过程,直到整个声明解析完毕。

有时候一个声明可能包含多个标识符,但一个未定义的标识符只存在于一个声明中。因此,阅读复杂指针声明时,应该从未定义的标识符开始阅读,而不是从括号开始。

先热身

用变量 a 表示以下定义:

a) 一个整型数

int a;

b) 一个指向整型数的指针

int *a;

c) 一个指向指针的指针,它指向的指针是指向一个整型数

int **a;

d) 一个有10个整型数的数组

int a[10];

e) 一个有10个指针的数组,该指针是指向一个整型数的。

int *a[10];

f) 一个指向有10个整型数数组的指针

int(*a)[10];

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数

int(*a)(int);

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

int(*a[10])(int);

复杂指针分析(面试会问)

int*(*(*fun)(int *))[10];

这个指针的解析依据右左法则:

  • 最里面的括号是 int *
  • 再往外是 *(*fun)(int *)
  • 再往外是一个指针 * ,指向一个数组 []
  • 最外层是一个 int

fun 是一个指针,指向一个函数。所指函数的参数是一个整型指针,返回值是一个指针,指向一个数组,该数组有十个元素。每个元素是一个整型指针。因此,fun 是数组指针的函数指针。

不要总结语句,要明白:一旦面试官提问复杂指针时,说出前面即可,最后这么说容易出错,有风险的事咱宁可不做。

function pointer examples

int (*func)(int *, int (*)(int *));

func 是一个指针,指向一个函数。所指函数的返回值是整型,有两个参数。第一个参数是整型指针,第二个参数是函数指针,指针所指函数的返回值为整型。func 是函数指针。

数组指针函数

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

func 是一个数组,里面有5个指针,每个指针指向一个函数。所指函数返回值是整型,函数参数是整型指针。func 是函数指针的数组。

指针数组函数

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

func 是一个指针,指向一个函数。所指函数的参数是整型指针,返回值是指针,指向一个数组,数组里有5个整型指针。func 是数组指针的函数指针。

函数数组指针

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

func 是一个函数,参数是整型指针,返回值是指针,指向一个数组,数组里有5个整型指针。func 是数组指针的函数。

typedef做类型的重定义

公司中很少会用到复杂的语句。我们可以通过定义新的类型来简化复杂指针的使用。

例如,Ar 重定义为:

typedef int *Ar;

然后使用时为:

Ar *p;

可以提升代码的可读性。例如:

typedef int (*Ar)(int *);

定义之后,就可以直接使用:

Ar func;

或者:

Ar *pfun[5];

typedef 的应用非常广泛。无论是重定义标准类型,还是自定义复杂结构,typedef 都是你的好帮手。

通过以上方式,公司中的开发人员可以避免使用复杂指针,而直接写出清晰的代码。遇到真正需要使用复杂指针的情况时,尽量避免了,除非非常必要。

记住:复杂代码容易出错,增加维护成本。在实际工作中,团队的代码风格和代码质量至关重要。

转载地址:http://exosz.baihongyu.com/

你可能感兴趣的文章
【Linux】VMware Workstation 不可恢复错误: (vcpu-0)
查看>>
VS中 fatal error LNK1123: 转换到 COFF 期间失败 的解决方法
查看>>
关于Img标签在固定宽高的容器内部以图片比例缩放存在
查看>>
pyhton---异常处理的终极语法、网页访问基本读取、网页访问异常处理
查看>>
linux下编程出现 对'sem_wait'未定义的引用解决方案
查看>>
前端框架(react+umi+dva+ant design pro )攻克: 二、react 父子组件通信(二)
查看>>
ant design pro v5去掉右边content区域的水印
查看>>
web_求和(练习)
查看>>
JavaScript——使用iterator遍历迭代map,set集合元素
查看>>
IAR调试卡顿的解决办法
查看>>
应用程序无法启动,应用程序的并行配置不正确完美解决方法
查看>>
强大的文字处理器——Nisus Writer Pro
查看>>
如何轻松适应从Windows到MacOS的过渡!Mac新手入门指南
查看>>
fcpx插件:25个假日主题专业设计
查看>>
fcpx插件:Block Party for Mac(53个视频转场插件)
查看>>
代码绘制五角形
查看>>
Course Schedule II
查看>>
线程总结
查看>>
<hdu - 1002> A + B Problem II
查看>>
Python识别璇玑图中诗的数量
查看>>