變長數組(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[*][*])
未完待續……