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};        //对元素进行部分赋值

123000

                       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的各元素的值如图所示

123400

                       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

 

   

  

本文标签: 数组