博客
关于我
复杂指针解析
阅读量:542 次
发布时间: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/

你可能感兴趣的文章
487-3279 POJ-1022【前导0~思维漏洞】
查看>>
Struts2-从值栈获取list集合数据(三种方式)
查看>>
vscode中快速生成vue模板
查看>>
QT报make: Circular all <- first dependency dropped.错误解决。
查看>>
demo---购物车的多条记录保存(cookie)
查看>>
参考图像
查看>>
*.json: [“usingComponents“][“van-button“] 未找到
查看>>
设计模式(18)——中介者模式
查看>>
用JavaScript实现希尔排序
查看>>
python初学者容易犯的错误
查看>>
error LNK2019:无法解析的外部符号_imp_CryptAcquireContextA@20
查看>>
Qt之QImage无法获取图片尺寸(宽和高)
查看>>
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
查看>>
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED
查看>>
Java-类加载过程
查看>>
BUU-MISC-认真你就输了
查看>>
BUU-MISC-caesar
查看>>
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
查看>>
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
查看>>
一文学会JVM常见参数设置+调优经验(JDK1.8)
查看>>