复合字面量

这篇博客介绍了C99标准引入的复合字面量特性,如何用于传递数组参数。复合字面量允许在不创建永久性数组的情况下,临时创建匿名数组,并可以直接传递给函数,简化了代码且提高了效率。文中还举例说明了如何通过复合字面量创建一维和二维数组,并解释了其块作用域的特性,强调了只适用于支持C99标准的编译器。
摘要由CSDN通过智能技术生成

给带int形参的函数传递一个值,可以传递一个int类型的变量,也可以是一个in类型的常量,例如5。
对于带数组形参的函数,在C99标准以前,可以传递数组,但没有等价的数组常量。
C99新增了复合字面量(compound literal)。字面量是除符号常量外的常量。例如,5是int类型字面量,81.3是double类型的字面量,'Y’是char类型的字面量,"elephant"是字符串字面量。
对于数组,复合字面量类似数组初始化,前面是用括号括起来的类型名。
例如,下面是个普通的数组声明:

int diva[2]=[10.20]; //声明数组

下面的复合字面量创建了一个与diva数组相同的匿名数组:

(int [2]){10,20};  //复合字面量

注意,去掉声明中的数组名,留下的int [2]即是复合字面量的类型名。
初始化有数组名的数组时可以省略数组大小,复合字面量也可以省略大小,编译器会自动计算数组当前的元素个数:

(int []){50, 20, 90} // 内含3个元素的复合字面量

使用复合字面量

因为复合字面量是匿名的,所以不能先创建然后再使用它,必须在创建的同时使用它。
使用指针记录地址就是一种用法。也就是说,可以这样用:

int * pt1;
pt1 = (int [2]) {10, 20};

注意,该复合字面量的字面常量与上面创建的 diva 数组的字面常量完全相同。与有数组名的数组类似,**复合字面量的类型名也代表首元素的地址,所以可以把它赋给指向int的指针。然后便可使用这个指针。**例如,本例中*pt1是10,pt1[1]是20。

还可以把复合字面量作为实际参数传递给带有匹配形式参数的函数:

int sum(const int ar[], int n);
...
int total3;
total3 = sum((int []){4,4,4,5,5,5}, 6);

这种用法的好处是,把信息传入函数前不必先创建数组,这是复合字面量的典型用法。可以把这种用法应用于二维数组或多维数组。

int (*pt2)[4];   // 声明一个指向二维数组的指针,该数组内含2个数组
元素,
// 每个元素是内含4个int类型值的数组
pt2 = (int [2][4]) { {1,2,3,-9}, {4,5,6,-8} };

如上所示,该复合字面量的类型是int [2][4],即一个2×4的int数组。

注意:记住,复合字面量是提供只临时需要的值的一种手段。复合字面量具有块作用域(第12章将介绍相关内容),这意味着一旦离开定义复合字面量的块,程序将无法保证该字面量是否存在。也就是说,复合字面量的定义在最内层的花括号中。
只有支持C99的编译器才能正常使用复合字面量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值