C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部。例如下面这样的定义:
#define COLS 4 int sum3d(int ar[][COLS], int rows) { int r, c, tot; 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列的数组,则需要创建另一个函数。
创建一个处理任意的二维数组也是有可能的,但是比较繁琐。
正是以上原因,C99标准引入了变长数组,它允许使用变量定义数组各维,e.g.你可以使用下面的声明:
int quarters = 4; int regions = 5; double sales[quarters][regions]; //一个变长数组VAL
变长数组有一些限制:变长数组必须是自动存储类的,意味着它们必须在函数内部或作为函数参数声明,而且声明时不可以进行初始化。
先看一个简单的例子,简单的阐明如何编写一个计算任意二维int数组的和的函数
int sum2d(int rows, int cols, int ar[rows][cols]); //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 }
作者:cpoint
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.