變長數組(variable-length array,VLA)
阿新 • • 發佈:2018-01-22
初始 比較 blog turn 允許 正是 += pan 代碼 ,e.g.你可以使用下面的聲明:
處理二維數組的函數有一處可能不太容易理解,數組的行可以在函數調用的時候傳遞,但是數組的列卻只能被預置在函數內部。例如下面這樣的定義:
1 #define COLS 4 2 int sum3d(int ar[][COLS], int rows) 3 { 4 int r, c, tot; 5 tot = 0; 6 7 for(r = 0; r < rows; r++) 8 for(c = 0; c < COLS; c++) 9 tot += ar[r][c]; 10 returntot; 11 }
現在假定了如下的數組:
1 int array1[5][4]; 2 int array2[100][4]; 3 int array3[2][4];
可以使用下面的函數調用:
1 tot = sum2d(array1, 5); 2 tot = sum2d(array2, 100); 3 tot = sum2d(array3, 2);
這是因為行數可以傳遞給參量rows,而rows是一個變量。但是如果要處理6行5列的數組,則需要創建另一個函數。
創建一個處理任意的二維數組也是有可能的,但是比較繁瑣。
正是以上原因,C99標準引入了變長數組,它允許使用變量定義數組各維
int quarters = 4; int regions = 5; double sales[quarters][regions]; //一個變長數組VAL
變長數組有一些限制:變長數組必須是自動存儲類的,意味著它們必須在函數內部或作為函數參數聲明,而且聲明時不可以進行初始化。
先看一個簡單的例子,簡單的闡明如何編寫一個計算任意二維int數組的和的函數
1 int sum2d(int rows, int cols, int ar[rows][cols]); 2 //rows, cols 要先於ar[][]
C99標準規定,可以省略函數原型中的名稱,但是如果省略名稱,則需要用星號來代替省略的維數:
int sum2d(int , int, int ar[*][*]);
1 #include<stdio.h> 2 3 #define ROWS 3 4 #define COLS 4 5 6 int sum2d(int rows, int cols, int ar[rows][cols]) 7 { 8 int i, j, sum; 9 sum = 0; 10 11 for(i = 0; i < rows; i++) 12 for(j = 0; j < cols; j++) 13 sum += ar[i][j]; 14 return sum; 15 } 16 17 int main() 18 { 19 int i, j; 20 int junk[ROWS][COLS] = { 21 {2, 4, 6, 8}, 22 {3, 5, 7, 9}, 23 {12, 10, 8, 6} 24 }; 25 26 int morejunk[ROWS-1][COLS+2] = { 27 {20, 30, 40, 50, 60, 70}, 28 {5, 6, 7, 8, 9, 10} 29 }; 30 31 int varr[rs][cs]; //變長數組 32 33 for(i = 0; i < rs; i++) 34 for(j = 0; j < cs; j++) 35 varr[i][j] = i * j +j; 36 printf("3 * 5 array\n"); 37 printf("sum of all elemts = %d\n",sum2d(ROWS, COLS, junk)); 38 39 printf("2 * 6 array\n"); 40 printf("sum of all elemts = %d\n",sum2d(ROWS - 1, COLS + 2, morejunk)); 41 42 printf("3 * 10 array\n"); 43 printf("sum of all elemts = %d\n",sum2d(rs, cs, varr)); 44 45 return 0; 46 } 47 48 C代碼
變長數組(variable-length array,VLA)