复合字面量

  假设给带int类型形参的函数传递一个值,要传递int类型的变量,但是也可以传递int类型常量,对于带数组形参的函数,情况不同,可以传递数组,但是没有等价的数组常量。C99新增了复合字面量(compound ltra)。字面量是除符号常量外的常量,例如,5是int类型字面量,81.3是double类型的字面量,‘y’是Char类型的字面量,“elephat”是字符串方面量。发布C99标准的委员会认为,如果有代表数组和结构内容的复合字面量, 在编程时会更方便。

  1、对于数组,复合字面量类似数组初始,前而是用括号括起来的类型名。例如,下面是一个普通的数组声明:

    int diva[2] = {10, 20};

 

  2、下面的复合字面量创建了一个和diva 数组相间的匿名数组也有两个int类型的值:

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

  注意, 去掉声明中的数组名,留下的int (2)即是复合字面量的类型名.


  3、初始化有数组名的数组时可以省略数组大小,复合字面量也可以省略大小,编泽路会自动计贺数组当前的元素个数:
    ( int [] ) {10, 20, 30};


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

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


  5、还可以把复合字面量作为实际参数传递给带有匹配形式参数的函数:
    int sum(const int ar[], int n);

    。。。
    int total3;
    total3 = sum((int []){4,4,4,5,5,5), 6);

     这里,第1个实参是内含6个int类型值的数组,和数组名类似,这同时也是该数组首元素的地址。这种用法的好处是,把信息传入函数前不必先创建数组,这是复合字面量的典型用法。

  可以把这种用法应用于二维数组或多维数组。例如,下面的代码演示 了如何创建二维int数组并存储其地址:

    int (*pt2) [4];

    pt2 = (int [][4]) {{1,2,3,-9},{4,5,6,-8}}
  如上所示,该复合字面量的类型是int [2][4], 即一个2X4的int数组。

例子:

 

   

  记住,复合字面量是提供临时需要的值的一种手段。复合字面量具有块作用域,这意味这它的作用范围很有限,脱离作用块不会生效。

 

 

 

posted @ 2022-05-08 13:05  星雨boy  阅读(187)  评论(0)    收藏  举报