C语言—变长数组

作者:追风剑情 发布于:2019-10-13 18:25 分类:C

示例

//开发工具: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;
}

运行测试 
1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号