c允許同時使用多于1個的修飾符,這就使得可以創(chuàng)建如下各種各樣的類型
int board[8][8];//int數(shù)組的數(shù)組
int**ptr;//指向int的指針的指針
int *risks[10];//具有10個元素的數(shù)組,每個元素是一個指向int的指針
int (*rusks)[10];//一個指針,指向具有10個元素的int數(shù)組
int *oof[3][4];//一個3?4的數(shù)組,每個元素是一個指向int的指針
int (*uuf)[3][4];//一個指針,指向3×4的int數(shù)組
int(*uof[3])[4];//具有4個元素的int數(shù)組的指針
弄清楚這些聲明的訣竅便于理解使用修飾符的順序。下面這些規(guī)則會讓您對其有所了解:
1、表示一個數(shù)組的[]和表示一個函數(shù)的()具有相同的優(yōu)先級,這個優(yōu)先級高于簡潔運算符*的優(yōu)先級。這意味著下面的聲明使得risks是一個指針數(shù)組,而不是一個指向數(shù)組的指針:
int*risks[12];
2、[]和()都是從左到右進(jìn)行結(jié)合的。下面的聲明使goods是一個由12個具有50個int值的數(shù)據(jù)構(gòu)成的數(shù)組,而不是一個由50個具有12個int值的數(shù)組構(gòu)成的數(shù)組:
int goods[12][50];
3、[]和()具有相同的優(yōu)先級,但由于它們是從左到右結(jié)合的,所以下面的聲明在應(yīng)用方括號之前先將*和rusks組合在一起。這意味著rusks是一個指向具有10個int值的數(shù)組的指針:
int (*rusks)[10];
我們把這些規(guī)則應(yīng)用于下面這個聲明:
int off[3][4];
[3]具有比更高的優(yōu)先級,并且根據(jù)從左到右的規(guī)則,它的優(yōu)先級比[4]高。因此,off是一個具有3個元素的數(shù)組。下面是[4],所以off的元素是具有4個元素的數(shù)組。*說明這些元素都是指針。int完成了該描述:off是一個3元素的數(shù)組,每個元素是由4個指向int的指針組成的數(shù)組。或者簡單的說,它是一個3×4的指向int的指針數(shù)組。需要為12個指針留出存儲空間。
現(xiàn)在來看看這個聲明:
int(*uuf)[3][4];
圓括號使修飾符*具有更高優(yōu)先級,所以uuf就是一個指向3×4的int數(shù)組的指針。需要為一個單個指針留出存儲空間。
這些規(guī)則同樣也產(chǎn)生下面的類型:
char*fump();//返回指向char的指針的函數(shù)
char(*frump)();//指向返回類型為char的函數(shù)的指針
char(*flump[3])();//由3個指針組成的數(shù)組,每個指針指向返回類型為char的函數(shù)
可以使用typedef建立一系列相關(guān)的類型
typedef int arr5[5];
typedef arr5*p_arr5;
typedef p_arr5 arrp10[10];
arr5 togs; //togs是具有5個元素的int數(shù)組
p_arr5 p2; //p2是一個指針,指向具有5個元素的int數(shù)組
arrp10 ap; //ap是具有10個元素的指針數(shù)組,每個指針指向具有5個元素的int數(shù)組
當(dāng)把結(jié)構(gòu)也帶入這樣的描述中,聲明的可能性真的會變得很復(fù)雜