C99新增内容之变长数组(VLA)
我们在使用多维数组是有一点,任何情况下只能省略第一维的长度。比如在函数中要传一个数组时,数组的行可以在函数调用时传递,当属数组的列却只能在能被预置在函数内部。看下面一个例子:
#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)的更多相关文章
- C99新特性:变长数组(VLA)
C99标准引入了变长数组,它允许使用变量定义数组各维.例如您可以使用下面的声明: ; ; double sales[rows][cols]; // 一个变长数组(VLA) 变长数组有一些限制,它必须是 ...
- C99中的变长数组(VLA)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- 变长数组(variable-length array,VLA)(C99)
处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部.例如下面这样的定义: #define COLS 4 int sum3d(int ar[] ...
- C99新增内容之复合文字(compound literal)
前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- oracle:变长数组varray,嵌套表,集合
创建变长数组类型 ) ); 这个变长数组最多可以容纳两个数据,数据的类型为 varchar2(50) 更改元素类型的大小或精度 可以更改变长数组类型和嵌套表类型 元素的大小. ALTER TYPE ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
随机推荐
- DOCKER - 容器抓包
https://help.aliyun.com/knowledge_detail/40564.html?spm=a2c4e.11153940.blogcont272172.10.b09e28a6AOd ...
- ES6学习历程(字符串的扩展)
字符串的扩展 在看这一节的时候前半部分写的都是关于unicode的内容,我个人感觉这部分在实际的开发中用的很少,所以不打算在做记录,等届时用到再有针对性的看,所以就将在ES6里面关于字符串操作的一些新 ...
- codevs——4189 字典&&HihoCoder #1014 : Trie树
题目描述 Description 最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000) 现在skyzhong需要在字典里查询以某一段字母开头的 ...
- python json结构
=====================================================json==============================import reques ...
- https://github.com/MediaTek-Labs/linkit-smart-7688-feed编译失败
mkdir -p /home/fly/workdir/LinkltSmart7688Duo-20170626/openwrt/dl/home/fly/workdir/LinkltSmart7688Du ...
- 该页必须使用安全性较高的Web 浏览器查看
当用https访问某个网站时,IE提醒“该页必须使用安全性较高的Web 浏览器查看” 您要访问的资源使用了128位版本的“安全套接层(SSL)” 安全保护.要查看该资源,您需要使用支持该版本的SSL浏 ...
- JVM内存监控(五)
频繁fullgc排查 jvm配置 -Xms200m -Xmx200m -Xmn50m -XX:PermSize=30m -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpA ...
- hdu_hpu第八次周赛_1002 大菲波数_201310270958
大菲波数 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- ERROR: mount point </.alt.rootd3_EISMar14/opt/oracle/product/10.2> is already in use
在给solaris系统升级的时候,用lu方法遇到下面的错误. -bash-3.2# lumount rootd3_EISMar14 ERROR: mount point </.alt.rootd ...
- Oracle EBS LOV速度优化
一.现象 本文地址:http://blog.csdn.net/sunansheng/article/details/50952758 当我们的EBS LOV的SQL写得比較复杂.或者数据量比較多时,L ...