10.8 变长数组(VLA)
为何只把数组的行数作为函数的形参,而列数却内置在函数体内。例如:
#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 array[5][4];
int array2[100][4];
int array3[2][4];
可以用sum2d()函数分别计算这些数组的元素之和:
tot = sum2d( array, 5 ); //5*4数组的元素之和
tot = sum2d( array2, 100 ); //100*4数组的元素之和
tot = sum2d( array3, 2 ); //2*4数组的元素之和
sum2d()之所以能处理这些数组,是因为这些数组的列数固定为4,而行数被传递给形参rows,rows是一个变量。如果列数不为4,这就不能使用这个函数。因为C规定,数组的位数必须为常量,不能用变量来代替COLS。
要创建一个能处理任意大小二维数组的函数,比较繁琐(必须把数组作为移位数组传递,然后让函数计算每行的开始处)。而且,
C Primer Plus(6) 中文版 第10章 数组和指针 10.8 变长数组(VLA)
![](https://img-home.csdnimg.cn/images/20240711042549.png)