假設需要向一個帶有int型參量的函數傳遞一個值,這時可以傳遞一個int型常量,也可以傳遞一個int型的變量。在C99標准之前,數組參數情況於現在不一樣,沒有所謂的數組常量可供傳遞,而在C99中增加了復合文字。文字是非符號的常量,如5是int型的文字25.3是double型的文字。由此可見如果有能夠表示數組和結構內容的文字,那麼編程將會更加方便。
對於數組來說,復合文字看起來就像是在數組初始化列表加上圓括號括起來的類型名,例如:下面是普通數組的聲明方法:
int a[2]={10,20};
下面是一個復合文字,它創建了一個包含兩個int型的無名稱數組:
(int [2]){10,20};
注意、類型名就是前面聲明中去掉a的剩余部分,即int [2]
正如初始化一個數組時可以不指定數組的大小一樣,初始化一個復合文字也可以省略大小:
(int []){10,20,30}; //有三個元素的復合文字
由於這些符合文字沒有名字,不能在一個語句中創建他們,需要在其他語句中使用。使用的一種方法是使用指針:
int *p;
p=(int []){10,20,30};
注意這個文字常量被表示為一個int型數組。與數組名相同,這個常量表示這個數組的首地址,如在本例中:
*p==10
另外復合文字可以作為參數傳遞給一個函數:
int sum(int ar[],int n)
...............
int tot;
tot=sum((int []){1,,2,3,4},4);
這種給函數傳遞數組信息而不用先創建數組的方式,符合常量通常的使用方法。
這種方法也可以使用在多維數組的使用上面,如創建一個二維數組並保存其地址:
int (*p)[4];
p=(int [2][4]){{1,2,3,4},{5,6,7,8}};
其中復合文字類型是int [2][4],即一個2*4的int數組。
綜合使用代碼:
#include <stdio.h>
#define COLS 4
void sum2d (int a[][COLS],int row);
void sum (int a[],int n);
int main (void)
{
int *p1;
int (*p2)[COLS];
p1=(int [2]){10,20};
p2=(int [2][COLS]){{1,2,3,4},{5,6,7,8}};
sum (p1,2);
sum2d (p2,2);
}
void sum (int a[],int n)
{
int tot=0;
for (int i=0;i<n;i++)
{
tot+=a[i];
}
printf ("The sum of all is %d\n",tot);
}
void sum2d (int a[][COLS],int row)
{
int tot=0;
for (int i=0;i<row;i++)
{
for (int j=0;j<COLS;j++)
{
tot+=a[i][j];
}
}
printf ("The sum of all is %d\n",tot);
}