1. 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递一个int常量,比如5。在C99标准之前,数组参数的情况是不相同的:可以传递数组,但没有所谓的数组常量可供传递。C99新增了复合文字(compound literal)。文字是非符号常量,例如5是int类型的文字,81.3是double类型的文字,'Y'是char类型的文字。开发C99标准的委员会认为,如果有能够表示数组和结构内容的复合文字,那么在编写程序时将更为方便。
对于数组来说,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。例如,下面是普通数组的声明方法:
int diva[2] = {10, 20};
下面是一个复合文字,创建了一个包含两个int值的无名称数组:
(int [2]){10, 20}
注意:类型名就是前面声明中去掉diva后剩余的部分,即int[2]。
2. 正如初始化一个命名数组时可以省略数组大小一样,初始化一个复合文字时可以省略数组大小,编译器会自动计算元素的数目:
(int []){50, 20, 90} // 有3个元素的复合文字
3. 由于这些复合文字没有名称,因此不可能在一个语句中创建它们,然后在另一个语句中使用。而是必须在创建它们的同时通过某种方法来使用它们,一种方法是使用指针保存其位置。请看下面的例子:
int * ptr; ptr = (int [2]){10, 20};
与数组名相同,这个常量本身同时代表首元素的地址,因此可以用它给一个指向int的指针赋值。随后就可以使用这个指针。
4. 另外,复合文字也可以做为实际参数被传递给带有类型与之匹配的形式参量的函数:
int sum(int ar[]. int n); … int total; total = sum((int []){4, 4, 4, 5, 5, 5}, 6);
5. 可以把这种技巧用在处理二维数组或多维数组的函数中。例如,下面的代码介绍如何创建一个二维int数组并保存其地址:
int (*ptr)[4]; ptr = (int [][4]){{1, 2, 3, -9}, {4, 5, 6, -8}};
6. 适用于结构的复合文字:
(struct book){"The Idiot", "Fyodor Dostoyevsky", 6.99}
可以对结构的复合文字取地址:
struct rect { double x; double y }; struct rect * area = &(struct rect){10.5, 20.0};
ref: 《C Primer Plus》