我们在使用多维数组是有一点,任何情况下只能省略第一维的长度。比如在函数中要传一个数组时,数组的行可以在函数调用时传递,当属数组的列却只能在能被预置在函数内部。看下面一个例子:

#define COLS 4
int sum2d(int ar[][COLS],int rows)
{
int r;
int c;
int 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列的数组时,则需要创建另一个新的函数,其COLS定义为5.这是由于数组的维数必须是常量;因此不能用一个变量来代替COLS;

出于上述原因,C99C标准引入了变长数组,它允许使用变量定义数组的各维。例如:

int quarters=;
int regions=;
double sales[rregions][quarters];//定义了一个变长数组(VLA)

正如前面提到的,变长数组有一些限制。变长数组必须是自动存储类的,也就是说他们必须在函数内部或作为函数的参量声明,而且声明时不可以进行初始化。

用下面一个代码示范如何声明一个二维变长数组参数的函数:

int sum2d(int rows,int cols,int ar[rows][cols]);//arS是一个变长数组

注:前面两个参量(rows和cols)用作数组参量ar的维数。因为ar中声明了rows和cols,所以在常量列表中,他们两个声明需要早于ar。

C99C标准规定,可以在函数名称中的名称;但是如果省略名称,则需要用 * 来代替省略的维数。

int sum2d(int,int,int ar[rows][cols]);//ar是一个变长数组,其中省略了维数参量的名称

注:函数定义参量列表中的变长数组声明实际上并没有创建数组,和以前一样,变长数组名实际上是一个指针,也就是说具有变长数组参量的函数实际上并没有创建数组,因此他有能力修改作为参数传递进来的数组。

C99新增内容之变长数组(VLA)的更多相关文章

  1. C99新特性:变长数组(VLA)

    C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...

  2. C99中的变长数组(VLA)

    处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...

  3. 变长数组(variable-length array,VLA)(C99)

    处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...

  4. C99新增内容之复合文字(compound literal)

    前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...

  5. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  6. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  7. oracle:变长数组varray,嵌套表,集合

    创建变长数组类型 ) );  这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...

  8. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  9. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

随机推荐

  1. kernel memory code learn

    mem alloc page Noticeble: 1. there are two kind of page: virtual page, physical page. 2. the page st ...

  2. 6.shell脚本

    6.1 shell基础语法 6.1.1 shell的概述 shell的基本概念 1.什么是shell shell是用户和Linux操作系统之间的接口,它提供了与操作系统之间的通讯方式 shell是一个 ...

  3. 一个电商项目的Web服务化改造

    一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...

  4. 用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率

    无意中学习到了一种测试 javascript 代码执行效率的一种方法,就记下来便于以后使用,用到了console对象中的  time  和  timeEnd  方法 . console.time('m ...

  5. 【codeforces 514B】Han Solo and Lazer Gun

    [题目链接]:http://codeforces.com/contest/514/problem/B [题意] 每次攻击可以把经过自己的一条直线上的所有点都毁掉; 然后给你n个目标物的坐标 问你最少要 ...

  6. [luoguP3275] [SCOI2011]糖果(差分约束)

    传送门 差分约束裸题 但是坑! 有一个点是长为10W的链,需要逆序加边才能过(真是玄学) 还有各种坑爹数据 开longlong ——代码 #include <cstdio> #includ ...

  7. V - 吉哥系列故事――完美队形I Manacher

    吉哥又想出了一个新的完美队形游戏!  假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要 ...

  8. BZOJ——T 1800: [Ahoi2009]fly 飞行棋

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1767  Solved: 1395[Submit][Status][Discuss] Descripti ...

  9. install pip 回顾

    在install pip的时候遇到如下问题 1. yum install 想安装一个package 总是提示没有package 可以安装. 但是后来可以了 2. make 和 configure 到底 ...

  10. SQLiteOpenHelper/SQLiteDatabase/Cursor源代码解析

    转载请注明出处:http://blog.csdn.net/y_zhiwen/article/details/51583188 Github地址.欢迎star和follow 新增android sqli ...