5.2 二维数组

一、二维数组的定义

类型说明符 数组名 [常量表达式(行)][常量表达式(列)]

a[2][3] 代表一个2行3列的数组

第一列 第二列 第三列
第一行 a[0][0] a[0][1] a[0][2]
第二行 a[1][0] a[1][1] a[1][2]

a[i][j] 代表第i+1行,第j+1列

二、二维数组在内存中的存储方式(详细见指针的部分介绍)

实际上二维数组的存储也是线性的,是在内存单元中开辟一个连续的内存空间
类比一维数组

整型单元 a[0] a[1] a[2]
地址 1000 1004 1008

二维数组的存储

整型单元 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
地址 1000 1004 1008 1012 1016 1020

三、二维数组的初始化

完全初始化

1. 第一种
int a[2][3]={1,2,3,4,5,6};
第一列 第二列 第三列
第一行 1 2 3
第二行 4 5 6
2. 第二种
int a[2][3]={
               {1,2,3},
               {4,5,6}
};

不完全初始化

1. 第一种
int a[3][4]={1};
//其他所有元素则默认为0;
2. 第二种
//这种只适合部分编译器
int a[3][4]={
    {1,2,3,4},
    {},
    {9,10,11,12}
}
3. 第三种
int a[3][4]={
    {1,2,3,4},
    {5,6},
    {9,10,11,12}
}
4. 第四种
int a[3][4]={
    {1,2,3,4},
    {5,6}
}
5. 第五种
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//这种编译器会根据输入的元素,自动计算这是个几行4列的数组;
//注意不能省略列数!!!

四、二维数组的引用

通过指针引用多维数组(见指针部分)

普通引用

数组名[行标][列标]

a[0][1]=5;
a[i+3][a[0][5]]=a[0][1]*2;

下标可以是整型表达式

五、二维数组的操作

输出二维数组

int main(void)
{	
	int a[3][4]={
		{1, 2, 3, 4},
		{5, 6, 7, 8},
		{9,10,11,12}
	};
	int i,j;
	for(i=0;i<3;++i)
	{
		printf("第%d行的元素是:\n",i+1);
		for(j=0;j<4;++j)
		{		
			printf("%-5d",a[i][j]);
            //-5表示按左对齐,且占5个格			
		}
		printf("\n");
	}
	return 0;
}

求二维数组最大的元素返回下标

#include <stdio.h>
#include <stdlib.h>
/*
输出函数
*/
void show(int a[][5])
{
    int i,j;
	for(i=0;i<6;++i)
	{
		printf("第%d行的元素是:\n",i+1);
		for(j=0;j<5;++j)
		{		
			printf("%-5d",a[i][j]);			
		}
		printf("\n");
	}
}
/*
求每一行的最大元素
*/
void max_row(int a[][5])
{
	int i,j;
	int k = 0;
	for(i=0;i<6;++i)//i<行数
	{
		for(j=0;j<5-1;++j)//j<列数-1
		{
			if(a[i][j]>a[i][j+1])
			{
				k=a[i][j+1];
				a[i][j+1]=a[i][j];
				a[i][j]=k;				
			}			
		}
		printf("第%d行最大元素是:%d\n",i+1,a[i][4]);//a[行][最后一列列标]
	}
}
/*
求该数组的最大元素,并返回其下标。
*/
void max(int a[][5])
{
	int max = a[0][0];
	int i,j,row,colum;
	for(i=0;i<6;++i)
	{
		for(j=0;j<5;++j)
		{
			if(a[i][j]>max)
			{
				max=a[i][j];
				row=i;
				colum=j;
				//printf("最大值是:%d\n其行标是:%d,其列标是:%d\n",a[i][j],i,j);
			}
		}
	}
	printf("该数组中元素的最大值是:%d\n其行标是:%d,其列标是:%d\n",max,row,colum);

}
int main(void)
{	
	int a[6][5]={
		{1, 2, 10, 4, 6},
		{5, 22, 7, 8, 9},
		{9,6,11,12,100},
		{33,54,32,99,30},
		{77},
		{99}
	};
    show(a);
    max_row(a);
	max(a);
	system("pause");
	return 0;
}

求二维数组的鞍点(该行最大、该列最小)

指针学过后再补充

判断矩阵是否对称

1 2 4 7
2 3 5 8
4 5 6 9
7 8 9 10

如上图所示,这是一个对称矩阵

int main(void)
{
    int a[4][5] = {
        {1,2,4,7},
        {2,3,5,8},
        {4,5,6,9},
        {7,8,8,10},
        {0}
    };

    int i=0;
    int j=0;
    for(i=0;i<4;++i)
    {
        for(j=0;j<4;++j)
        {
            if(a[i][j]!=a[j][i])
            {
                printf("这不是一个对称矩阵!");
                return 0;
            }
        }
    }
    printf("这是一个对称矩阵!");
    return 0;   
}

六、是否存在真正的多维数组

不存在
因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组
以二维数组为例: int a[3][4]
该数组是含有3个元素的一维数组
只不过每个元素都相当于一个包含4个元素的一维数组。


本文章使用limfx的vsocde插件快速发布