假设须要向带有一个int参量的函数传递一个值,您能够传递一个Int变量,也能够传递一个int常量,好比5。在C99标准出现以前,数组参数的状况是不一样的:能够传递数组,但没有所谓的数组常量可供传递。c++
C99新增了复合文字(compound literal)。文字是非符号常量。例如:5是int类型的文字,81.3是double类型的文字,‘Y’是char类型的文字,“elephant”是字符串文字。开发c99标准的委员会认为,若是有可以表示数组和结构 的复合文字,那么在编写程序时将更为方便。数组
于数对组来讲,复合文字看起来像是在数组的初始化列表前面加上用圆括号括起来的类型名。例如,下面是普通数组的声明方法:函数
int diva[2] = {10,20} ;指针
下面是一个复合文字,建立了一个包含两个int值的无名称数组:code
(int [2]) {10,20} //一个复合文字开发
注意:类型名就是前面声明中去掉diva后剩余的部分,即int [2] 。字符串
正如初始化一个数组时能够省略数组的大小同样,初始化一个复合文字时也能够省略数组大小,编译器会自动计算元素数目:编译器
(int [ ]) {50,20,90} //有三个元素的复合文字it
因为这些复合文字没有名称,所以不能够在一个语句中建立他们,而后在另外一个语句中使用。而是必须在建立它们的同时经过某种方法来使用它们,一种方法是使用指针保存其位置。请参看下面的例子:io
int * pt1;
pt1 = (int [2]) {10,20} ;
请注意这个文字常量被标识为一个int 数组。与数组名相同,这个常量同时表明首元素的地址,所以能够用它给一个指向int的指针赋值。随后就可使用这个指针。例如,本例中*pt1是10,pt1[1]是20。
另外,复合文字也能够作为实际参数被传递给带有类型与之匹配的形式参量的函数:
int sum (int ar [ ] ,int n ) ;
...
int total3 ;
total3 = sum( (int [ ] ){4,4,4,5,5,5},6) ;
上面的例子中,第一个参数是包含6个元素的int数组,同时也是首元素的地址(同数组名同样)。这种给函数传递信息而没必要先建立数组的方法,是复合常量的一般使用方法。
能够把这种技巧用在处理2维数组或多维数组的函数中。例如,下面的代码介绍如何建立一个二维int数组并保存其地址:
int (*pt2) [4] ; //声明一个指向包含4个int的数组的指针
pt2 = (int [2][4]) { {1,2,3,-9},{4,5,6,-8} } ;
其中复合文字的类型是int [2][4],即一个2x4的int数组。
程序清单 10.19 把上面的这些例子包含到一个完整的程序内。
//flc.c --有趣的常量 #include <stdio.h> #define COLS 4 int sum2d(int ar[][COLS],int rows); int sum(int ar[],int n ); int main (void) { int total1,total2,total3; int *pt1; int (*pt2) [COLS]; pt1 = (int [2]){10,20}; pt2 = (int [2][COLS]){ {1,2,3,-9},{4,5,6,-8} }; total1 = sum(pt1,2); total2 = sum2d(pt2,2); total3 = sum((int []){4,4,4,5,5,5},6); printf("total1 = %d\n",total1); printf("total2 = %d\n",total2); printf("total3 = %d\n",total3); return 0; } int sum (int ar[],int n) { int i; int total = 0; for (i=0;i<n;i++) total+=ar[i]; return total; } int sum2d (int ar[][COLS],int rows) { int r,c; int tot=0; for(r=0;r<rows;r++) for(c=0;c<COLS;c++) tot+=ar[r][c]; return tot ; }