读懂复杂C声明的黄金法则

在网上碰见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完以后以为收获很大,须要练习一下。php

黄金法则:从声明的变量名开始,先向右看,再向左看,再向右看,再向左看 。。。数组

若是向右看的时候遇到 ),则一直向左看,直到遇到 ( 跳出这层括号。而后再重复向右看,向左看。函数

举例说明:指针

例子1code

int a;

a 的右边什么都没有,向左看int,说明a是一个int型变量。blog

例子2get

char *a;

向右看,什么都没有; 向左看是*, 说明a是一个指针; 再向右看,什么都没有; 再向左看是char,说明a是一个指向char的指针。变量

例子3总结

int *a[];

向右看,[]说明a是一个数组;向左看,*说明数组的每一个元素是个指针;再向右看,什么都没有; 再向左看,int,每一个指针指向一个整数。综合来看,a是一个数组,数组每一个元素是指向整数的指针。co

例子4

int * const a;

向a右边看,什么都没有。一直向左看,先是const,说明a是不可修改的,而后是*,说明a是一个指针;而后是int,说明指针指向整数。综合来看,a是一个不可修改的指针,它指向整数。

例子5

void (*checkout)();

向右看,碰见 ) 返回,再向左看是*,说明checkout是个指针。再向右看,是(),说明这个指针指向函数; 向左看是void,说明函数返回void。总的来看, checkout是一个指向返回void的函数的指针。

例子6

void (*checkout[])();

向右看,[]说明checkout是一个数组;向左看, * 说明数组每一个元素是个指针。向右看,碰见)返回;再向左看,碰见(返回。再向右看,是(),说明数组内每一个指针指向函数; 向左看是void,说明每一个函数返回void。
总的来看, checkout是一个数组,数组内都是指向返回void的函数的指针。

例子7

void (*(*checkout)[])();

向右看,碰见)返回; 向左看,*说明checkout是个指针,遇到(跳出一层()。向右看,[]说明checkout指向的是一个数组;向左看, *说明数组每一个元素是个指针。向右看碰见),向左看碰见(,跳出一层()。向右看,()说明数组每一个元素指向一个函数;再向左看,void说明每一个数组元素指向的函数返回void。 总结:checkout是一个指针,指向一个数组,每一个数组元素都是一个指向返回void函数的指针。