本文共 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/