3

在网上遇见felix,他让我读 http://www.felix021.com/blog/read.php?2072,读完之后觉得收获很大,需要练习一下。

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

如果向右看的时候遇到 ),则一直向左看,直到遇到 ( 跳出这层括号。然后再重复向右看,向左看。

举例说明:

例子1

int a;

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

例子2

char *a;

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

例子3

int *a[];

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

例子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函数的指针。


jollywing
721 声望13 粉丝