变长数组(variable-length array)是C语言C99标准中新增加的内容,此处所谓的“变”并非在说该类型的数组在创建后可修改大小,变长数组的大小在创建后也是不能修改的。那为什么此处称为“变长”呢,是因为变长数组的维可以用变量来指定。这一点特性弥补了C99之前的变量维度只能用常量或常量表达式指定的不足。
变长数组是有一些限制的,变长数组只可在函数内部或作为函数参数声明。并且在声明是不能初始化。
来看一个例子:
编写一个程序,初始化一个3x5的二维double数组,并利用一个基于变长数组的函数把该数组复制到另一个二维数组。还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NxM数组。
1 #include <stdio.h> 2 3 void copy(int row,int col, double arr[][col],double tar[row][col]); 4 void show(int,int,double arr[*][*]); 5 6 int main(void){ 7 8 double num[3][5]={ 9 {2.3,1.2,5.2,6.1,1.1}, 10 {4.2,3.2,6.2,1.7,7.4}, 11 {8.5,6.2,4.7,2.8,2.1} 12 }; 13 14 double rain[5][12]={ 15 {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}, 16 {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,1.4,7.3}, 17 {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4}, 18 {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,1.7,4.3,6.2}, 19 {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2} 20 }; 21 22 double tar[3][5]={0}; 23 double tar2[5][12]={0}; 24 25 copy(3,5,num,tar); 26 show(3,5,tar); 27 28 copy(5,12,rain,tar2); 29 show(5,12,tar2); 30 31 return 0; 32 } 33 34 void copy(int row,int col,double arr[][col],double tar[row][col]){ 35 int i,j; 36 for(i=0;i<row;i++){ 37 for(j=0;j<col;j++){ 38 tar[i][j]=arr[i][j]; 39 } 40 } 41 } 42 43 void show(int row,int col,double arr[row][col]){ 44 int i,j; 45 for(i=0;i<row;i++){ 46 for(j=0;j<col;j++){ 47 printf("%.1f",arr[i][j]); 48 if(j!=col-1)printf(", "); 49 } 50 printf("\n"); 51 } 52 printf("--------------------------------------\n\n"); 53 }
在这个例子中,给定两个二维数组,一个3X5数组和一个5X12数组,而例子中这两个数组用同一个函数处理拷贝或用同一个函数显示。
其中用于显示的函数:
void show(int row,int col,double arr[row][col])
是一个变长数组的定义方法,将代表维的整数声明在使用该维的变长数组之前。因为在原型中可以省略变量名,所以原型可以写为:
void show(int,int,double arr[*][*])
未完待续……