示例
//开发工具:Dev-C++ 5.11
#include <stdio.h>
#include <stdlib.h>
#define ROWS 2
#define COLS 3
//下面两种声明形参方式等效
//int sum2d(int rows, int cols, int ar[rows][cols]);
int sum2d(int, int, int ar[*][*]);
int main(int argc, char *argv[])
{
int junk[ROWS+1][COLS+1] = {
{2, 4, 6, 8},
{3, 5, 7, 9},
{12,10,8, 6}
};
/* 变长数组(VLA) */
//这里的“变”指的是:在创建数组时,可以使用变量指定数组的维度
int rs = 3;
int cs = 4;
/*
变长数组(variable-length array, VLA)是C99新增特性。
C11把变长数组作为一个可选特性,而不是必须强制实现的特性。
变长数组必须是自动存储类别,不能使用static或extern存储类别说明符.
不能在声明中初始化它们.
const和数组大小
const int SZ = 80;
double ar[SZ]; //是否允许?
C90标准不允许(也可能允许)。数组的大小必须是给定的整型常量表达式,
可以整型常量组合,如20、sizeof表达式或其他不是const的内容。
由于C实现可以扩大整型常量表达式的范围,所以可能会允许使用const,
但是这种代码可能无法移植。
C99/C11标准允许在声明变长数组时使用const变量。所以该数组的定义必须在
块中的自动存储类别数组。
变长数组还允许动态内存分配,这说明可以在程序运行时指定数组的大小。普通
C数组都是静态内存分配,即可编译时确定数组的大小。由于数组大小是常量,所以
编译器在编译时就知道了。
*/
int varr[rs][cs];
int i, j;
for (i=0; i<rs; i++)
for (j=0; j<cs; j++)
varr[i][j] = i*j+j;
/* end */
printf("Sum of all elements = %d\n", sum2d(rs, cs, junk));
printf("[VLA]Sum of all elements = %d\n", sum2d(rs, cs, varr));
system("pause");
return 0;
}
int sum2d(int rows, int cols, int ar[rows][cols])
{
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;
}