对于数组来说,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。
#include <stdio.h>int main() { int iArray[]={10,20}; //普通数组 int &pArray=(int []){10,20}; //一个复合文字 //int &pArray=(int [2]){10,20}; 与上文等效 return 0; }
复制代码- 类型名就是前面声明中去掉iArray后剩余部分,即int[2]。
- 初始化复合文字可省略数组大小,编译器会自动计算元素数目。
- 复合文字没名称,必须创建时通过特定类型表示他们,便于使用。
复合文字充当函数参数
复合文字也可以作为实际参数被传递给带有类型与之匹配的形式参量的函数。如下测试案例:
#include <stdio.h>void print(int array[], int arrayNum) { for (int i = 0; i < arrayNum; i++) { printf("%d\t", array[i]); } } int main() { print((int[]){1,2,3,4,5,6}, 6); return 0; }
复制代码此处第一个参数是包含6个元素的int型数组,同时也是首元素的地址(同数组名一样)。这种给函数传递信息而不必先创建数组的做法,是复合常量的通常使用方法。
二维数组或多维数组中复合文字
用这种技巧也可以用在处理二维数组或多维数组的函数中。例如,下面的代码介绍如何创建一个二维int数组并保存其地址。
#include <stdio.h>int main() { int(*pArray)[4];//声明一个数组指针 pArray = (int[2][4]){ {1,2,3,-9},{4,5,6,-8} }; return 0; }
复制代码用如下结构体复合文字用法。
#include <stdio.h>#include <string.h> struct MM { char firstName[20]; char secondName[20]; }; void getName(struct MM mm) { puts(strcat(mm.firstName, mm.secondName)); } int main() { getName((struct MM) { "小", "可爱" }); //调用 return 0; }
复制代码#include <stdio.h>#include <string.h> struct MM { char firstName[20]; char secondName[20]; }; int main() { struct MM* pMM = &((struct MM) { "小", "可爱" }); //调用 printf("%s%s\n", pMM->firstName, pMM->secondName); return 0; }
复制代码总结
- 当一个类似结构的东西需要临时构造的时候,可以用 (type_name){xx,xx,xx},而type_name就是之前定义的格式,去掉变量名(数组名)即可, 这种使用方法有点像 C++ 的构造函数。
- 复合文字就相当于一个常量,只不过形式较为复杂而已,所有可以用常量的地方均可以用复合文字,例如,宏定义。
- 使用复合文字,在想传一个“常量”时,就不必先定义,再传值了,比如传一个常数坐标(struct point{double x;double y;}),这样就不用先定义一个结构变量,再传结构体过去了,代码更加简洁。
- 值得注意的是,复合文字具有左值语义。