VLA
變長陣列(VLA)的原型寫法、聲明位置及變長陣列的本質,vla原型變長陣列(variable-length array)是C語言C99標準中新增加的內容,此處所謂的「變」並非在說該類型的陣列在創建後可修改大小,變長陣列的大小在創建後也是不能修改的。那為什麼此處稱為「變長」呢,是因為變長陣列的維可以用變數來指定。這一點特性彌補了C99之前的變數維度只能用常量或常量表達式指定的不足。
變長陣列是有一些限制的,變長陣列只可在函數內部或作為函數參數聲明。並且在聲明是不能初始化。
來看一個例子:
編寫一個程序,初始化一個3x5的二維double陣列,並利用一個基於變長陣列的函數把該陣列複製到另一個二維陣列。還要編寫一個基於變長陣列的函數來顯示兩個陣列的內容。這兩個函數應該能夠處理任意的NxM陣列。
#include <stdio.h>
void copy(int row, int col, double arr[][col], double tar[row][col]);
void show(int, int, double arr[*][*]);
int main(void)
{
double num[3][5] = {
{2.3, 1.2, 5.2, 6.1, 1.1},
{4.2, 3.2, 6.2, 1.7, 7.4},
{8.5, 6.2, 4.7, 2.8, 2.1}
};
double rain[5][12] = {
{4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
{9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
{7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
{7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}
};
double tar[3][5] = {0};
double tar2[5][12] = {0};
copy(3, 5, num, tar);
show(3, 5, tar);
copy(5, 12, rain, tar2);
show(5, 12, tar2);
return 0;
}
void copy(int row, int col, double arr[][col], double tar[row][col])
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
tar[i][j] = arr[i][j];
}
}
}
void show(int row, int col, double arr[row][col])
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%.1f", arr[i][j]);
if (j != col - 1) {
printf(", ");
}
}
printf("\n");
}
printf("------------------------------
在這個例子中,給定兩個二維陣列,一個3X5陣列和一個5X12陣列,而例子中這兩個陣列用同一個函數處理拷貝或用同一個函數顯示。
其中用於顯示的函數:
void show(int row,int col,double arr[row][col])
是一個變長陣列的定義方法,將代表維的整數聲明在使用該維的變長陣列之前。因為在原型中可以省略變數名,所以原型可以寫為:
void show(int,int,double arr[*][*])