假設須要向帶有一個int參量的函數傳遞一個值,您能夠傳遞一個Int變量,也能夠傳遞一個int常量,好比5。在C99標準出現以前,數組參數的狀況是不一樣的:能夠傳遞數組,但沒有所謂的數組常量可供傳遞。c++
C99新增了複合文字(compound literal)。文字是非符號常量。例如:5是int類型的文字,81.3是double類型的文字,‘Y’是char類型的文字,「elephant」是字符串文字。開發c99標準的委員會認爲,若是有可以表示數組和結構 的複合文字,那麼在編寫程序時將更爲方便。數組
於數對組來講,複合文字看起來像是在數組的初始化列表前面加上用圓括號括起來的類型名。例如,下面是普通數組的聲明方法:函數
int diva[2] = {10,20} ;指針
下面是一個複合文字,建立了一個包含兩個int值的無名稱數組:code
(int [2]) {10,20} //一個複合文字開發
注意:類型名就是前面聲明中去掉diva後剩餘的部分,即int [2] 。字符串
正如初始化一個數組時能夠省略數組的大小同樣,初始化一個複合文字時也能夠省略數組大小,編譯器會自動計算元素數目:編譯器
(int [ ]) {50,20,90} //有三個元素的複合文字it
因爲這些複合文字沒有名稱,所以不能夠在一個語句中建立他們,而後在另外一個語句中使用。而是必須在建立它們的同時經過某種方法來使用它們,一種方法是使用指針保存其位置。請參看下面的例子:io
int * pt1;
pt1 = (int [2]) {10,20} ;
請注意這個文字常量被標識爲一個int 數組。與數組名相同,這個常量同時表明首元素的地址,所以能夠用它給一個指向int的指針賦值。隨後就可使用這個指針。例如,本例中*pt1是10,pt1[1]是20。
另外,複合文字也能夠作爲實際參數被傳遞給帶有類型與之匹配的形式參量的函數:
int sum (int ar [ ] ,int n ) ;
...
int total3 ;
total3 = sum( (int [ ] ){4,4,4,5,5,5},6) ;
上面的例子中,第一個參數是包含6個元素的int數組,同時也是首元素的地址(同數組名同樣)。這種給函數傳遞信息而沒必要先建立數組的方法,是複合常量的一般使用方法。
能夠把這種技巧用在處理2維數組或多維數組的函數中。例如,下面的代碼介紹如何建立一個二維int數組並保存其地址:
int (*pt2) [4] ; //聲明一個指向包含4個int的數組的指針
pt2 = (int [2][4]) { {1,2,3,-9},{4,5,6,-8} } ;
其中複合文字的類型是int [2][4],即一個2x4的int數組。
程序清單 10.19 把上面的這些例子包含到一個完整的程序內。
//flc.c --有趣的常量 #include <stdio.h> #define COLS 4 int sum2d(int ar[][COLS],int rows); int sum(int ar[],int n ); int main (void) { int total1,total2,total3; int *pt1; int (*pt2) [COLS]; pt1 = (int [2]){10,20}; pt2 = (int [2][COLS]){ {1,2,3,-9},{4,5,6,-8} }; total1 = sum(pt1,2); total2 = sum2d(pt2,2); total3 = sum((int []){4,4,4,5,5,5},6); printf("total1 = %d\n",total1); printf("total2 = %d\n",total2); printf("total3 = %d\n",total3); return 0; } int sum (int ar[],int n) { int i; int total = 0; for (i=0;i<n;i++) total+=ar[i]; return total; } int sum2d (int ar[][COLS],int rows) { int r,c; int tot=0; for(r=0;r<rows;r++) for(c=0;c<COLS;c++) tot+=ar[r][c]; return tot ; }