本节学习二维数组。二维数组与一维数组相似,但是用法上要比一维数组复杂一点。后面的编程中,二维数组用得很少,因为二维数组的本质就是一维数组,只不过形式上是二维的。能用二维数组解决的问题用一维数组也能解决。但是在某些情况下,比如矩阵,对于程序员来说使用二维数组会更形象直观,但对于计算机而言与一维数组是一样的。

二维数组的定义

二维数组定义的一般形式为:

类型说明符 数组名[ 常量表达式][ 常量表达式];

比如:

int a[3][4];

表示定义了一个 3×4,即 3 行 4 列总共有 12 个元素的数组 a。这 12 个元素的名字依次是:a[0][0]、a[0][1]、a[0][2]、a[0][3];a[1][0]、a[1][1]、a[1][2]、a[1][3];a[2][0]、a[2][1]、a[2][2]、a[2][3]。

与一维数组一样,行序号和列序号的下标都是从 0 开始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。数组 int a[m][n] 最大范围处的元素是 a[m–1][n–1]。所以在引用数组元素时应该注意,下标值应在定义的数组大小的范围内。

此外,与一维数组一样,定义数组时用到的“数组名[常量表达式][常量表达式]”和引用数组元素时用到的“数组名[下标][下标]”是有区别的。前者是定义一个数组,以及该数组的维数和各维的大小。而后者仅仅是元素的下标,像坐标一样,对应一个具体的元素。

C 语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组,即它的元素为一维数组。比如“int a[3][4];”可以看作有三个元素,每个元素都为一个长度为 4 的一维数组。而且 a[0]、a[2]、a[3] 分别是这三个一维数组的数组名。下面来验证一下看看是不是这么回事儿:

# include

int main(void)

{

int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

printf("%d\n", sizeof(a[0]));

return 0;

}

输出结果是:

16

可见 a[0] 确实是第一行一维数组的数组名,其他同理。

在 C 语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素,这样依次存放。

二维数组的初始化

可以用下面的方法对二维数组进行初始化。

1) 分行给二维数组赋初值,比如上面程序的赋值方法:

int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

这种赋初值的方法比较直观,将第一个花括号内的数据赋给第一行的元素、第二个花括号内的数据赋给第二行的元素……即每行看作一个元素,按行赋初值。

2) 也可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。比如:

int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

效果与第 1 种是一样的。但第1种方法更好,一行对一行,界限清楚。第 2 种方法如果数据多,写成一大片,容易遗漏,也不易检查。

3) 也可以只对部分元素赋初值。比如:

int a[3][4] = {{1, 2}, {5}, {9}};

它的作用是对第一行的前两个元素赋值、第二行和第三行的第一个元素赋值。其余元素自动为 0。初始化后数组各元素为:

4) 如果在定义数组时就对全部元素赋初值,即完全初始化,则第一维的长度可以不指定,但第二维的长度不能省。比如:

int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

等价于:

int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

系统会根据数据总数和第二维的长度算出第一维的长度。但这种省略的写法几乎不用,因为可读性差。

5) int a[3][4]={0};

二维数组“清零”,里面每一个元素都是零。

二维数组如何输出

二维数组有行和列,那么如何输出里面的元素呢?在讲述一维数组的时候说过,“数组的元素只能一个一个输出”,二维数组也不例外。在一维数组中是用一个 for 循环进行输出,而二维数组元素的输出要使用两个 for 循环嵌套。

# include

int main(void)

{

int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

int i; //行循环变量

int j; //列循环变量

for (i=0; i<3; ++i)

{

for (j=0; j<4; ++j)

{

printf("%-2d\x20", a[i][j]);

}

printf("\n");

}

return 0;

}

输出结果是:

1 2 3 4

5 6 7 8

9 10 11 12

提示:“printf("%-2d\x20",a[i][j]);”中的“%-2d”,其中“-”表示左对齐,如果不写“-”则默认表示右对齐;“2”表示这个元素输出时占两个空格的空间,所以连同后面的 \x20 则每个元素输出时都占三个空格的空间。

python定义二维数组_二维数组的定义、初始化和输出,C语言二维数组详解相关推荐

  1. C++接收字符串数组_电脑编程 你该知道的字符知识 C语言程序设计字符数组全归纳...

    怎么定义字符数组 C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的.用来存放字符数据的数组时字符数组.在字符数组中的一个元素内存放一个字符. 定义字符数组的方法与定义数值型数值的 ...

  2. [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  3. 定义一个没有参数的函数、输出python3次_Python函数参数详解,三天让你掌握python,不再是小白

    原标题:Python函数参数详解,三天让你掌握python,不再是小白 引言 随着程序功能的增多,代码量随之增大,此时仍不加区分地把所有功能的实现代码放到一起,将会使得程序的组织结构不清晰,可读性变差 ...

  4. 吃透Chisel语言.15.Chisel模块详解(二)——Chisel模块嵌套和ALU实现

    Chisel模块详解(二)--Chisel模块嵌套和ALU实现 稍微复杂点的硬件设计就需要用嵌套的模块层级来构建了,上一篇文章中实现的计数器其实就是个例子,计数器内部嵌套了一个寄存器.一个Mux和一个 ...

  5. 卷积的定义及其物理意义_高等数学入门——高阶导数的定义及其物理意义

    系列简介:这个系列文章讲解高等数学的基础内容,注重学习方法的培养,对初学者不易理解的问题往往会不惜笔墨加以解释.在内容上,以国内的经典教材"同济版高等数学"为蓝本,并对具体内容作了 ...

  6. 出参传递数组指针_C语言指针重难点详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  7. python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...

    一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...

  8. python基础-变量,变量类型,字符串str,元组tuple,列表list,字典dict操作详解(超详细)

    python基础--变量 (文章较长,若需要单独看某一个点,可点击目录直接跳转) 文章目录 python基础--变量 1. 变量 2. 变量类型 2.1数字类型 2.2 字符串 2.3 列表 2.4 ...

  9. python的装饰器迭代器与生成器_python3 装饰器、列表生成器、迭代器、内置方法详解等(第四周)...

    前言: 为什么要学习python3? 原因: 1.学习一门语言能力 2.通过该语言能力完成测试自动化以及独立完成自测框架知识 那么我要做什么呢? 1.每天花十个小时完成python3的学习 要在什么地 ...

  10. 数字电子技术基础第三版杨志忠_阎石数字电子技术基础第6版笔记和课后习题详解...

    阎石<数字电子技术基础>(第6版)笔记和课后习题(含考研真题)详解 第1章 数制和码制 1.1 复习笔记 本章作为<数字电子技术基础>的开篇章节,是数字电路学习的基础.本章介绍 ...

最新文章

  1. 《Think Python》最新中文版火了,附完整PDF下载!
  2. 字符串的原样输入输出python_Python字符串输入输出简述
  3. python正则表达式知识点
  4. python函数星号参数
  5. keystore是个嘛东西
  6. ArcEngine二次开发_03(鼠标在图层中选择要素进行高亮显示)
  7. Error: listen EADDRINUSE: address already in use :::5000
  8. asp2.0 GridView OnRowDataBound event
  9. 萤石云设备接入操作说明
  10. [笔记] 当当音乐人:免费将Midi转化为WAV
  11. 进制转换之2进制与16进制之间的相互转换
  12. day16 正则检测、匹配次数、分组与分支、re模块、匹配参数
  13. 专利撰写时一定要注重质量
  14. 2019徐州网络赛 K.Center (STL)
  15. 25个技巧和诀窍可以用来提高你的app性能
  16. opencv下载过慢的问题
  17. 【SAP】ABAP——币种金额转换
  18. BUUCTF-PWN刷题记录25(IO file attack)
  19. android输入法框架分析,Android与iOS输入法开发框架比较谈
  20. html八卦绘制,HTML+CSS实现画出一个太极八卦图案

热门文章

  1. sql2005服务和连接的外围应用配置器打不开解决方法
  2. 【CodeForces 1257C --- Dominated Subarray】
  3. eclipse打开js等文件CPU卡爆解决办法
  4. python twisted安装_windows python twisted下载 安装 使用
  5. 纯css模拟下雪效果
  6. 20多行js实现canvas雪夜下雪效果
  7. java byte声明_java——Byte类/包装类的使用说明
  8. 厉害了!这个人工智能化编辑部,一定让你大开眼界!(附:视频)
  9. F - Cow Contest
  10. MySQL如何删除表中一行数据