处理二维数组的函数有一处可能不太容易理解,数组的行可以在函数调用的时候传递,但是数组的列却只能被预置在函数内部。例如下面这样的定义:

#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代码

C99中的变长数组(VLA)的更多相关文章

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

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

  2. C99新增内容之变长数组(VLA)

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

  3. c 结构体中的变长数组

    在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: struct pppoe_tag { __u16 tag_type; __u16 tag_len; ...

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

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

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

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

  6. 第九章 C99可变长数组VLA详解

    C90及C++的数组对象定义是静态联编的,在编译期就必须给定对象的完整信息.但在程序设计过程中,我们常常遇到需要根据上下文环境来定义数组的情况,在运行期才能确知数组的长度.对于这种情况,C90及C++ ...

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

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

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

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

  9. PL/SQL — 变长数组

    PL/SQL变长数组是PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限制的.也即是说变长数组的下标固定下限等于1,上限可以扩展.下 ...

随机推荐

  1. 【WP8】同步执行异步代码

    微软的StorageFile只支持异步的方式进行文件操作,我之前也封装过一个StorageHelper,但是当所有的方法都是异步的时候也带来一些问题 1.比如我们不能在构造函数调用异步代码(等待), ...

  2. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...

  3. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  4. mysql中date_add()函数的使用?

    需求描述: 在使用mysql的过程中,需要对日期进行计算,比如对某个日期加上几天,几个小时等操作, 在此记录下,date_add()函数的使用. 操作过程: date_add()函数语法: DATE_ ...

  5. 模式(一)javascript设计模式

    模式有三种:Architectural Pattern.Design Pattern.Coding Pattern,即:框架模式.设计模式.编程模式.本文主要讲解javascript中的设计模式,好的 ...

  6. nginx配置:location配置方法及实例

    转载:https://blog.csdn.net/heiyueya/article/details/70149270 location匹配的是nginx的哪个变量? $request_uri loca ...

  7. Activiti 5.1.4最佳实践

    1.简单介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工作流和业 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求 ...

  9. ios开发周期之--(向上,向下,四舍五入)取整

    ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数值. round(x)返回x的四舍五入整数值.

  10. redis资料

    http://snowolf.iteye.com/blog/1630697  征服redis配置 http://redis.readthedocs.org/en/latest/  redis命令参考 ...