我們在使用多維數組是有一點,任何情況下只能省略第一維的長度。比如在函數中要傳一個數組時,數組的行可以在函數調用時傳遞,當屬數組的列卻只能在能被預置在函數內部。看下面一個例子:
#define COLS 4 int sum2d(int ar[][COLS],int rows) { int r; int c; int tot=0; for(r=0;r<rows;r++) for(c=0;c<COLS;c++) tot+=ar[r][c]; return tot; }
現在假設定義了如下數組:
int array1[5][4]; int array2[100][4]; int array3[2][4];
可以使用下面的函數調用:
tot=sum2d(array1,5); tot=sum2d(array2,100); tot=sum2d(array3,2);
這是因為行數可以傳遞給參量rows,而rows是一個變量。當時如果要處理6行5列的數組時,則需要創建另一個新的函數,其COLS定義為5.這是由於數組的維數必須是常量;因此不能用一個變量來代替COLS;
出於上述原因,C99C標准引入了變長數組,它允許使用變量定義數組的各維。例如:
int quarters=4; int regions=5; double sales[rregions][quarters];//定義了一個變長數組(VLA)
正如前面提到的,變長數組有一些限制。變長數組必須是自動存儲類的,也就是說他們必須在函數內部或作為函數的參量聲明,而且聲明時不可以進行初始化。
用下面一個代碼示范如何聲明一個二維變長數組參數的函數:
int sum2d(int rows,int cols,int ar[rows][cols]);//arS是一個變長數組
注:前面兩個參量(rows和cols)用作數組參量ar的維數。因為ar中聲明了rows和cols,所以在常量列表中,他們兩個聲明需要早於ar。
C99C標准規定,可以在函數名稱中的名稱;但是如果省略名稱,則需要用 * 來代替省略的維數。
int sum2d(int,int,int ar[rows][cols]);//ar是一個變長數組,其中省略了維數參量的名稱
注:函數定義參量列表中的變長數組聲明實際上並沒有創建數組,和以前一樣,變長數組名實際上是一個指針,也就是說具有變長數組參量的函數實際上並沒有創建數組,因此他有能力修改作為參數傳遞進來的數組。