黃金法則:從聲明的變量開始,先向右看,再向左看,再向右看,再向左看 。如果向右看的時候遇到),則一直向左看,直到遇到(跳出這層括號。然後再重復向右看,向左看。
舉例說明:
例子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函數的指針。
據說C++的面向對象和多態就是靠函數指針和函數指針數組實現的。