多维数组元素有多个下标,以标识它们在数组中的位置,所以也称为多下标变量。

一、二维数组的定义和引用

格式:

[存储类型符]   数据类型符   数组变量名[整型常量表达式1] [整型常量表达式2];

对二维数组中数据单元的引用格式如下:

数组变量名[下标1][下标2]

例子:

int a[2][3];

定义了a是一个2x3(2行3列)的数组,共6个整型的数组元素,分别是a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]、a[1][2]。

C语言把二维数组看作一个特殊的一维数组,它的数组元素又是一个一维数组,如上面定义的数组a,可以看作有两个数组元素a[0]、a[1]的一维数组;而a[0]、a[1]又是拥有3个int型数组元素构成的一维数组。a[0]可看作是由数组元素a[0][0]、a[0][1]和a[0][2]构成的一维数组名,而a[1]可看作是由a[1][0]、a[1][1]和a[1][2]构成的一维数组名

二维数组在物理上采用按行存储的顺序存储方式,我们称这种存储顺序为以行序为主序的顺序存储结构。

注意:二维数组所占内存空间的首地址,是一个地址常量。定义二维数组,a的值是2000,与a[0]的值相同,但意义不同。

对于数据单元在内存的地址可通过下面的公式计算:

有效地址=数组的起始地址+(下标1x第二维大小+下标2)xsizeof(元素类型)


二、二维数组的赋值

1、二维数组的初始化赋值

程序中定义二维数组时,可以对数组变量赋初始值。具体方法如下面两种:

(1)分行初始化赋值

一般格式为:

[存储类型] 数据类型 数组变量名[行常量表达式][列常量表达式]=

{{第0行初值表},{第1行初值表},...,{最后一行初值表}};

赋值规则为:将“第0行初值表”中的数据,依次赋给第0行中各元素;将“第一行初值表”中的数据,依次赋给第1行各元素;以此类推。下面给出分行初始化的例子:

例一:

int a[2]a[3]={{1,2,3},{4,5,6}};     //对数组元素全部赋值

1              2            3             4           5           6

a[0][0]   a[0][1]    a[0][2]    a[1][0]    a[1][1]    a[1][2]

例二:

int a[2][3]={{1},{3}};   //对数组部分赋值

1              0             0             3              0              0                                                                            a[0][0]     a[0][1]    a[0][2]      a[1][0]     a[1][1]        a[1][2]                                                                                                                                                                                                                              例三:

int a[][3]={{1,2},{4}};   //对数组元素部分赋值,省略第一维大小

这是因为编译系统将会依据初值表的个数来决定第一维的大小,如上面定义的数组a
有两个初值表,因此第一维的大小是2,所以共有6个数组元素。但是系统必须知道第二维
的大小,它不能省略。这种情况下,数组a的各元素的值,如图:

1                  2                 0                 4                  0                0

a[0][0]      a[0][1]         a[0][2]          a[1][0]          a[1][1]        a[1][2]

初值表中至少要包含一个初值。

int a[2][3]={{},{4,5,6}};            //第一个初值表为空,错误

(2)按元素在内存中的排列顺序初始化赋值

格式:

[存储类型符] 数据类型 数组变量名 [行常量表达式][列常量表达式]={初值表}

赋值规则:按二维数组中的元素在内存中的排列顺序,将初值表中的数据,依次赋给各元素,下面给出按这种方式初始化的例子:

例1:

int a[2][3]={1,2,3,4,5,6};     //对数组元素全部赋值

图与例一一样

例2:

int a[2][3]={1,2,3};        //对元素进行部分赋值

1 2 3 0 0 0

a[0][0]        a[0][1]         a[0][2]         a[1][0]        a[1][1]         a[1][2]

例3:

int a[ ][3] ={1,2,3,4};      //对数组元素部分赋值,省略第一维大小

这种情况下,数组a的各元素的值如图所示

1 2 3 4 0 0

a[0][0]         a[0][1]         a[0][2]        a[1][0]         a[1][1]         a[1][2]


2、二维数组在程序中的赋值

像一维数组在程序中赋值一样,二维数组在程序中赋值也可以通过赋值语句、循环逐一赋值以及使用库函数memset、memcpy等方法来进行。

例如,下面的程序是通过键盘输入对二维数组a个元素赋值。

int i,j,a[2][3];
for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",&a[2][3]);

下面通过调用memmset函数把数组a的各元素清0.

memset(a,0,6*sizeof(int)

假设还定义了数组int b[2][3];那么可通过memcpy函数将数组a各元素的值复制到数组b的个元素中。

memcpy(b,a,6*sizeof(int));

三、二维数组应用

经典例子:

有一个3x4的矩阵,要求编写程序求出其中最大的元素值以及其所在的行列号。

#include<stdio.h>
int main()
{int i,j,row=0,col=0,max;int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};   //定义数组并赋初值max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max)   //如果某元素大于max,就取代max的原值{max=a[i][j];row=i;     //记下此元素的行号col=j;    //记下此元素的列号}printf("max=%d,row=%d,col=%d\n",max,row,col);return 0;
}运行结果:
max=a[2][5],row=2,col=5

数组----二维数组相关推荐

  1. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  2. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

  3. php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 上面这个是针对二维数组的! 下面针对多维数组的乱序方法?尽可能的方便快速: 以下函数也是出自php手册,可 ...

  4. c/c++教程 - 1.7 数组 一维数组 二维数组

    九.数组 数组:一个里面存放了相同类型数据元素的集合. 特点:每个数组中的元素都是相同的数据类型:数组是由连续的内存位置组成的. 注意:数组的下标是从0开始索引. 参考视频:https://www.b ...

  5. php 数组重新打乱_php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 function shuffle_assoc($list) { if (!is_array($list)) ...

  6. day06数组-一维数组二维数组

    数组:          数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:                 1.数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. ...

  7. C语言数组——二维数组

    C语言目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS ...

  8. 数组(一维数组、多维数组/二维数组)和简单排序算法

    提示:数组是线性数据结构中最为基础,最为典型的一种顺序型结构. 它用一组连续的内存空间 ,来存储一组具有相同类型的数据. 与变量相比,变量是一种单一的数据存储方式,而数组是用于存储一连串的一组数据. ...

  9. 数组-二维数组中的查找

    题意: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: ...

  10. C# 数组 二维数组

    数组:相同数据类型的元素按一定顺序排列的集合.是一组变量 作用:操作大量数据    数组的定义 1.数组里面的内容必须是同一类型 2.数据必须有长度限制                         ...

最新文章

  1. 三个数字的运算规律预测
  2. Unix command to find CPU Utilization
  3. 苏宁物流研发中心运输产品线产品总监钟翼翔:IOT技术的应用分析
  4. vlan后 出现 outlook 正在试图从服务器检索数据
  5. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
  6. BroadcastReceiver应用详解(转)
  7. 解决VS命令提示符 “Setting environment for using Microsoft Visual Studio. 此时不应有“系列错误
  8. 荣耀V40屏幕素质得到“认证”:120Hz高刷屏没跑了
  9. 软件工程导论 01章软件工程学概述
  10. 图像局部特征(六)--斑点检测之SIFT算法原理总结补充
  11. 坦克大战小游戏的实现
  12. 基于UDP广播的局域网匿名聊天APP
  13. 餐巾计划问题 费用流
  14. 火车票能不能选座_电话订火车票可以自己选座位吗
  15. 测试点击屏幕次数的软件_一款让安卓手机更好用的软件——fooView
  16. 信息数据管理思维导图(Xmind)
  17. QT翻金币小游戏实现(三)
  18. C语言习题:猜数字游戏(C语言随机数)
  19. MySQL:使用PMM进行性能监控
  20. Android从相册中选取图片上传到阿里云OSS

热门文章

  1. 柱状图折线图混合使用
  2. 重组标签云-标签聚类及其评价研究
  3. 微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
  4. CodeForces 596B Wilbur and Array 贪心
  5. Java Web概述-练习题
  6. 自行车小组问卷调查报告
  7. Xshell 6 免费版下载及设置教程
  8. 系统集成项目管理工程师学习建议
  9. starUML建立模型及生成代码框架
  10. Python网络爬虫:利用正则表达式方法爬取‘’豆瓣读书‘’中‘’新书速递‘’条目