左右法則
右左法則:首先從最裏面的圓括號內未定義的標識符開始閱讀看起,然後往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裏面所有的東西,就跳出圓括號。重複這個過程直到整個聲明解析完畢。
總之對聲明進行分析,最根本的方法還是按優先級和結合性來類比替換,從那些最基本的聲明進行類比,簡化,從而進行理解。下面分析幾個例子,來具體闡述如何使用這種方法。
簡單:
int a; 這裏從變量看,向右看是分號,轉向左,是int 所以
a是整形變量
int *a; 從變量開始,先向右看,是分號,然後向左看,這裏有一個
*,說明變量a是一個指針,然後繼續向左,是int所以a是一
個整形指針變量
int **a; 這裏還是從變量開始看,先向右看,是分號,然後向左看
是*,說明是指針變量,然後繼續向左看,還是*,所以a是
指針的指針變量
int a[10]; 這裏從變量看,先向右看,是[],說明a是數組
int *a[10]; 這裏從變量看,先向右,是[],說明a是數組,然後向左
,可以看到是*,說明a是一個整形指針數組
int (*a)[10]; 從變量開始,先向右,是),說明a是一個變量
然後向左看,是*說明a是指針變量,然後繼續向
右看,是【】,所以a是數組指針變量
int (*a)(int); 從變量開始看,先向右,是),說明a是變量,然後
向左看,是*,所以a是指針變量,然後向右,是
(),說明是個函數,所以a是一個函數指針變量,
指針指向一個函數,函數的形參是int, 返回值,是
int
int (*a[10])(int); 從變量開始看,先向右 看,是【】,說明a是
一個數組,繼續向右,是),然後向左看,是
*,說明a是一個指針數組,繼續向右看,是
(),說明這是函數指針數組,行參數int,返
回值是int
困難:
int *(*(*arr[5])())();
arr是一個函數指針數組,該數組的元素指向爲函數,該函數的形參是空,返回值是函數指針,該指針指向是一個形參是空,返回值是int
float (*(*b())[])();
b是一個函數,該函數形參爲空,返回值爲數組指針,該指針指向一個函數指針數組,數組元素指向一個形參是空,返回值爲float
void *(*c)(char a, int (*b)());
c是一個函數指針變量,指向一個形參字符變量a,和一個形參是函數指針變量,無返回值
float (*(*e【10】)(int *))[5]
e是一個函數指針數組,數組裏的元素指向一個函數,該函數形參是int*,返回值爲數組指針,指向的數組爲float型數組