一维数组可以看作一行连续的数据,只有一个下标。C语言允许构造二维数组甚至多维数组,在实际问题中有时候常常需要用到二维数组(例如数学上的矩阵),二维数组有两个下标,以确定某个元素在数组中的位置。

(一)二维数组的定义

二维数组定义一般的格式是:

DataType ArrayName[Row][Colume];

其中,DataType可以是任何数据类型,ArrayName是数组名,Row是数组的行,Colume是列;

例如int m[5][9];表示的是如下一个5行9列的矩阵:

为了访问i行j列的元素,需要用m[i][j]的形式

虽然在上面我们以表格的形式表示二维数组,但我们需要知道在计算机内存中并不存在这样的存储,C语言是按照行主序的方式存储多维数组,并且是存储在连续空间中,也就是说先存储第0行元素,接着第1行,以此类推。在内存中的布局如下图所示:

(二)二维数组的初始化

(1)完全初始化

通过嵌套一维初始化的方式可以产生二维数组的初始化式:

     int m[][] = { { , , , , , , , ,  },
{ , , , , , , , , },
{ , , , , , , , , },
{ , , , , , , , , },
{ , , , , , , , , } };

(2)不完全初始化

如果初始化没有大到填满整个二维数组,剩余的元素将被赋值为0:

(a)初始化只填充前面3行,后面两行元素被初始化为0:

     int m[][] = { { , , , , , , , ,  },
{ , , , , , , , , },
{ , , , , , , , , } };

(b)内层列表没有达到足以填充一行,该行剩余元素被初始化为0:

    int m[][] = { { , , , , , , , ,  },
{ , , , , , , , , },
{ , , , , , , , , },
{ , , , , , , , } ,
{ , , , , , , , , } };

甚至可以省略内层花括号(但强烈建议不用这种方式):

     int m[][] = { , , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , ,
, , , , , , , , };

因为一旦编译器发现数值足以填满一行,它就开始填充下一行。但是需要知道,在多维数组中省略内层花括号是非常危险的,因为在不完全初始化的情况下,缺失的元素将会影响初始化,编译器无法计算每行每列该初始化多少个元素。

常用的一个初始化方法,全初始化为0: int a[][] = {};

(三)二维数组的遍历

对于二维数组,一般用双层循环来遍历,

(1)遍历赋值

     int a[][];
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
a[i][j] = i + j;
}
}

(2)遍历打印:

     for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}

程序输出:


最新文章

  1. 阶段一:AsyncTask的三个属性值和四个步骤
  2. javaScript 验证表单提交
  3. SpringMVC中定时器继承Task后无法对service注入问题
  4. C++小常识笔记
  5. 开源分布式实时计算引擎 Iveely Computing 之 安装部署(2)
  6. mac安装最新版本的git
  7. 每个人都应该知晓的8项Resharper快捷键
  8. Python学习总结3:元组、列表的操作汇总
  9. Quantum &amp; r2q
  10. WCF Windows Service Using TopShelf and ServiceModelEx z
  11. 宏_CRTIMP分析
  12. 美丽的for循环语句
  13. C#入门(一):IDE
  14. 使用Iterator遍历Sheet(POI)验证及解释结果有序性
  15. 洛谷 [P3355] 骑士共存问题
  16. 强大核心功能矩阵,详解腾讯云负载均衡CLB高可靠高性能背后架构
  17. 二十四、Hadoop学记笔记————Spark的架构
  18. NIO 简介
  19. JavaScript定义函数
  20. Oracle 生成工作日历表

热门文章

  1. module.exports与exports的联系与区别
  2. Docker 相关命令汇总
  3. MySQL---视图、触发器
  4. 用sqldeveloper连接数据库
  5. h5开发中所遇到的兼容性及所遇到的常见问题
  6. 使用随机数以及扩容表进行join代码
  7. C语言小程序-基于链表的学生信息管理
  8. 【blockly教程】第六章 Blockly的进阶
  9. VS2015编译MapWinGIS
  10. BZOJ1066_蜥蜴_KEY