复杂指针的阅读与声明

C/C++ 2014年07月06日 ,

在使用C/C++特别是C语言进行程序设计时,对底层的操作及语言的灵活性主要体现在指针的使用上。然而有些时候指针的声明过于复杂,很不容易看明白。本文介绍一种方法来阅读指针的声明。

复杂指针的阅读

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。如:

int (*func)(int *p);

首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。

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

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

int** p;                 // p指向一个int*的变量,它是指向指针的指针。
void(*p)(void);          // p指向一个函数,该函数不接收参数,也不返回值。
int(*p)(int,int);        // p指向一个函数,该函数接收两个int参数,并且返回一个int。
void(**p)(void);         // p指向一个函数的指针,它指向的指针指向的函数不接收参数也不返回值,它是指向指针的指针。
void(*p[10])(void);      // p是一个数组,每个元素都是一个指针,并且每个元素都指向一个函数,这个函数不接收参数也不返回值。
void(*(*p)[10])(void);   // p是一个指针,它指向一个有10个元素的数组,这个数组的每个元素都是一个指针,并且每个元素都指向一个不接收参数也不返回值的函数。
int(*(*p)(void))[10];    // p是一个指针,它指向一个函数,这个函数不接收参数,并且返回一个指针,这个指针指向10个int的数组。
void(*(*p)(void))(void); // p是一个指针,它指向一个函数,这个函数不接收参数,并且返回一个指针,这个指针也指向一个函数,这个函数不接收参数,也不返回值。

其他再复杂的声明无非就是在函数的参数是函数指针、数组指针、指针数组,进行嵌套扩展。阅读时只要仔细就会很轻易的分析清楚。通常复杂的指针的声明会使用typedef进行简化的声明,增加可读性。

枫竹梦

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《复杂指针的阅读与声明》
日志链接:http://furzoom.com/complex-pointer-declaration/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部