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

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

最新文章

  1. SQL导入Excel文件
  2. spring支持的websocket
  3. python--web.py使用
  4. [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP
  5. [javascript|基本概念]学习笔记
  6. oracle存储过程分页
  7. Win+R指令(2)
  8. hdu 3912 Turn Right
  9. 作为一名JAVA程序员应该有怎样的就业思维
  10. Angular2 Service实践
  11. hdu 5869 区间不同GCD个数(树状数组)
  12. CentOS7 安装phpMyAdmin-4.8.3-all-languages
  13. vue-cli脚手架安装和webpack-simple模板项目生成
  14. .NET技术-1.0.使用反射、特性简化代码(验证Model类)
  15. python3 词法拆分
  16. 强大的svg操作库——Raphael
  17. SqlServer共用表达式(CTE)With As
  18. SQL 实践和技巧 &lt;2&gt;
  19. linq to sql 中增删改查
  20. docker 实例设置自动重启

热门文章

  1. bootCDN引用的bootstrap前端框架套件和示例
  2. Retrofit 二次封装实践
  3. [精] UBOOT2017+FIT 启动流程详尽分析
  4. WeakReference Reference ReferenceQueue
  5. LeetCode 394. 字符串解码(Decode String) 44
  6. [转帖]UML类图新手入门级介绍
  7. [转帖]关于4A(统一安全管理平台)系统的理解
  8. python笔记:删除列表元素和根据索引查找元素
  9. Mac Mini(late 2014) 添加NVMe固态组Fusion Drive
  10. TCP/IP详解 IP路由选择