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

#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. input按钮的事件处理大全

    input按钮的事件处理大全   input按钮的事件处理大全1.<INPUT onclick=document.all.WebBrowser.ExecWB(1,1) type=button v ...

  2. 文章或者观点说说等点赞功能实现(thinkphp)

    前端的代码: <!-- 点赞 --> <div class='btm'><a class='zan' id="{$article.id}" href= ...

  3. 1 Web 知识基础

    一.什么是跨域访问举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求 ...

  4. js 根据数组分组动态生成table(相同项合并)

    <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/ ...

  5. uva 133(The Dole Queue UVA - 133)

    一道比较难想的模拟题,用了队列等东西,发现还是挺难做的,索性直接看了刘汝佳的代码,发现还是刘汝佳厉害! 代码本身难度并不是很大,主要还是p=(p+n+d-1)%n+1;这一句有些难度,实际上经过自己的 ...

  6. 如何在redhat 7上安装VNC服务器

    平时我们基本上都是用xshell或者用putty远程我们的linux服务器,如果我们的linux服务器安装了图型化界面那我们又该如何远程使用我们的图形化界面呢?下面我们用vnc来实现远程我们的linu ...

  7. 3.3.4 lambda 表达式

    lambda表达式常用来声明匿名函数,即没有函数名字的临时使用的小函数,例如第2章中列表对象的sort()方法以及内置函数sorted()中key参数.lambda表达式只可以包含一个表达式,不允许包 ...

  8. ubuntu16.04安装jdk/mysql/tomcat (使用apt-get命令)

    安装jdk 更新系统安装包缓存,并且安装OpenJDK8 sudo apt-get update sudo apt-get install openjdk-8-jdk 检查jdk版本 java -ve ...

  9. [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]

    建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...

  10. PatentTips - Fair scalable reader-writer mutual exclusion

    BACKGROUND The present invention relates generally to multithreaded programming and, more specifical ...