预计阅读本页时间:-
假设需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递一个int常量,比如5。在C99标准出现之前,数组参数的情况是不同的:可以传递数组,但没有所谓的数组常量可供传递。C99新增了复合文字(compound literal)。文字是非符号常量。例如:5是int类型的文字,81.3是double类型的文字,‘Y’是char类型的文字,“elephant”是字符串文字。开发C99标准的委员会认为,如果有能够表示数组和结构内容的复合文字,那么在编写程序时将更为方便。
对于数组来说,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。例如,下面是普通数组的声明方法:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
下面是一个复合文字,创建了一个包含两个int值的无名称数组:
注意:类型名就是前面声明中去掉diva后剩余的部分,即int[2]。
正如初始化一个命名数组时可以省略数组大小一样,初始化一个复合文字时也可以省略数组大小,编译器会自动计算元素的数目:
由于这些复合文字没有名称,因此不可能在一个语句中创建它们,然后在另一个语句中使用。而是必须在创建它们的同时通过某种方法来使用它们,一种方法是使用指针保存其位置。请参看下面的例子:
请注意这个文字常量被标识为一个int数组。与数组名相同,这个常量同时代表首元素的地址,因此可以用它给一个指向int的指针赋值。随后就可以使用这个指针。例如,本例中*ptl是10,ptl[1]是20。
另外,复合文字也可以做为实际参数被传递给带有类型与之匹配的形式参量的函数:
上面的例子中,第一个参数是包含6个元素的int数组,同时也是首元素地址(同数组名一样)。这种给函数传递信息而不必先创建数组的做法,是复合常量的通常使用方法。
可以把这种技巧用在处理二维数组或多维数组的函数中。例如,下面的代码介绍如何创建一个二维int数组并保存其地址:
其中复合文字的类型是int[2][4],即一个2×4的int数组。
程序清单10.19把上面这些例子包含到一个完整的程序内。
程序清单10.19 flc.c程序
这个示例程序需要支持C99的编译器(但目前,很多编译器还不支持)。输出结果如下: