admin 管理员组文章数量: 887021
数组
多维数组元素有多个下标,以标识它们在数组中的位置,所以也称为多下标变量。
一、二维数组的定义和引用
格式:
[存储类型符] 数据类型符 数组变量名[整型常量表达式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
本文标签: 数组
版权声明:本文标题:数组 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687858738h150081.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论