1. 程式人生 > >變長數組(variable-length array,VLA)

變長數組(variable-length array,VLA)

初始 比較 blog turn 允許 正是 += pan 代碼

處理二維數組的函數有一處可能不太容易理解,數組的行可以在函數調用的時候傳遞,但是數組的列卻只能被預置在函數內部。例如下面這樣的定義:

 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     return
tot; 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標準引入了變長數組,它允許使用變量定義數組各維

,e.g.你可以使用下面的聲明:

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)