变长数组(variable-length array,VLA)(C99)
2024-09-03 22:14:59
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部。例如下面这样的定义:
#define COLS 4
int sum3d(int ar[][COLS], int rows)
{
int r, c, tot;
tot = ; for(r = ; r < rows; r++)
for(c = ; c < COLS; c++)
tot += ar[r][c];
return tot;
}
现在假定了如下的数组:
int array1[][];
int array2[][];
int array3[][];
可以使用下面的函数调用:
tot = sum2d(array1, );
tot = sum2d(array2, );
tot = sum2d(array3, );
这是因为行数可以传递给参量rows,而rows是一个变量。但是如果要处理6行5列的数组,则需要创建另一个函数。
创建一个处理任意的二维数组也是有可能的,但是比较繁琐。
正是以上原因,C99标准引入了变长数组,它允许使用变量定义数组各维,e.g.你可以使用下面的声明:
int quarters = ;
int regions = ;
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[*][*]);
#include<stdio.h> #define ROWS 3
#define COLS 4 int sum2d(int rows, int cols, int ar[rows][cols])
{
int i, j, sum;
sum = ; for(i = ; i < rows; i++)
for(j = ; j < cols; j++)
sum += ar[i][j];
return sum;
} int main()
{
int i, j;
int junk[ROWS][COLS] = {
{, , , },
{, , , },
{, , , }
}; int morejunk[ROWS-][COLS+] = {
{, , , , , },
{, , , , , }
}; int varr[rs][cs]; //变长数组 for(i = ; i < rs; i++)
for(j = ; j < cs; j++)
varr[i][j] = i * j +j;
printf("3 * 5 array\n");
printf("sum of all elemts = %d\n",sum2d(ROWS, COLS, junk)); printf("2 * 6 array\n");
printf("sum of all elemts = %d\n",sum2d(ROWS - , COLS + , morejunk)); printf("3 * 10 array\n");
printf("sum of all elemts = %d\n",sum2d(rs, cs, varr)); return ;
} C代码
最新文章
- SQL导入Excel文件
- spring支持的websocket
- python--web.py使用
- [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
- [javascript|基本概念]学习笔记
- oracle存储过程分页
- Win+R指令(2)
- hdu 3912 Turn Right
- 作为一名JAVA程序员应该有怎样的就业思维
- Angular2 Service实践
- hdu 5869 区间不同GCD个数(树状数组)
- CentOS7 安装phpMyAdmin-4.8.3-all-languages
- vue-cli脚手架安装和webpack-simple模板项目生成
- .NET技术-1.0.使用反射、特性简化代码(验证Model类)
- python3 词法拆分
- 强大的svg操作库——Raphael
- SqlServer共用表达式(CTE)With As
- SQL 实践和技巧 <;2>;
- linq to sql 中增删改查
- docker 实例设置自动重启
热门文章
- bootCDN引用的bootstrap前端框架套件和示例
- Retrofit 二次封装实践
- [精] UBOOT2017+FIT 启动流程详尽分析
- WeakReference Reference ReferenceQueue
- LeetCode 394. 字符串解码(Decode String) 44
- [转帖]UML类图新手入门级介绍
- [转帖]关于4A(统一安全管理平台)系统的理解
- python笔记:删除列表元素和根据索引查找元素
- Mac Mini(late 2014) 添加NVMe固态组Fusion Drive
- TCP/IP详解 IP路由选择