重温C语言 | 二维数组

二维数组:

矩阵的表示形式
多个一维数组组成二维数组

二维数组的定义:

定义格式:数据类型 数组名[长度1] [长度2]

  • 数据类型:表示数组中元素的类型
    长度1 : 表示二维数组的行数
    长度2 : 表示二维数组的列数

    说明:表示由长度1个一维数组构成二维数组 每个一维数组元素的个数是长度2

二维数组的初始化

  • 1)数组只有在初始化的时候才能使用大括号的形式对其进行整体赋值,其他情况下均不能整体赋值
  • 2)完全初始化,给数组中所有的元素进行赋值,系统默认从第一行第一列元素开始依次赋值,先行后列的形式。按行完全初始化,不按行完全初始化
    int a[3][4]={{1,2,3,4},{5,6,6,6},{7,7,8,7}}//按行完全初始化
    int a[3][4]={1,2,3,4,5,6,6,6,7,7,8,7}//不按行完全初始化
  • 3)部分初始化,系统默认未被初始化的元素赋值为0.按照先行后列的形式进行赋值,
    按行部分初始化,不按行部分初始化
    int a[3][4]={{3,4},{5,6,6},{7,7}}//按行部分初始化
    3 4 0 0
    5 6 6 0
    7 7 0 0
    int a[3][4]={3,4,5,6,6,7,7}//不按行部分初始化
    3 4 5 6
    6 7 7 0
    0 0 0 0
  • 4)如果对二维数组进行初始化的时候,其行数可以省略不写,二维的数组的列数不能省略,行数的划分—列数决定
    int a[][4]={3,4,5,6,6,7,7}; //2行4列
  • 5) 如果二维数组只定义,不赋值,则二维数组中元素的值为随机值

二维数组的引用 赋值

行+列才能确定一个元素
数组元素的引用:数组名[行下标][列下标]
下标开始都是从0开始

a[3][4];
a[0][0]   a[0][i]
a[0][3]
a[1][3]   a[1][i]
a[2][3]   a[2][i]

二维数组元素的赋值:通过 数组名[行下标][列下标]采用循环的方式赋值

	for(i  = 0; i < 3; i++)
	{
 	  	for(j = 0; j < 4; j++)
 		  {
    	   scanf(“%d”,&a[i][j])
	  	 }
	}

举个栗子:
目的:为了灵活运用,行列的变化
int a[3][4] = {10,11,23,45,89,90,67,55,99,88,56,97,}
以矩阵的形式打印数组的内容
计算每一行的平均值,以及每一行的最大值
行不变:列相加/4
计算每一列的平均值,以及每一列的最大值

#include <stdio.h>


int main()
{
	int a[3][4] = {10,11,23,45,89,90,67,55,99,88,56,97};
	int i,j;
    float ave = 0;
    int max;


	for(i = 0; i < 3; i++)
	{
		for(j = 0; j < 4; j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}


	for(i = 0; i < 3; i++)
	{
		ave = 0;
		max = a[i][0]; //假设当前行的第0列为最大值
		for(j = 0; j < 4; j++)
		{
			ave += a[i][j]/4.0;
			if(max < a[i][j])
			{
				max = a[i][j];
			}

		}
	    printf("%d 行的平均值为 %.2f\n",i,ave);
		printf("%d 行的最大值值为 %d\n",i,max);
		printf("---------------------------------------\n");
	}

    for(i = 0; i < 4; i++)
	{
		ave = 0;
		max = a[0][i]; //假设当前行的第0行i列为最大值
		for(j = 0; j < 3; j++)
		{
			ave += a[j][i]/4.0;
			if(max < a[j][i])
			{
				max = a[j][i];
			}

		}
	    printf("%d 列的平均值为 %.2f\n",i,ave);
		printf("%d 列的最大值值为 %d\n",i,max);
		printf("---------------------------------------\n");
	}
}

输出结果:

[csy@local array_two]$ ./array_two1
10 11 23 45 
89 90 67 55 
99 88 56 97 
0 行的平均值为 22.25
0 行的最大值值为 45
---------------------------------------
1 行的平均值为 75.25
1 行的最大值值为 90
---------------------------------------
2 行的平均值为 85.00
2 行的最大值值为 99
---------------------------------------
0 列的平均值为 49.50
0 列的最大值值为 99
---------------------------------------
1 列的平均值为 47.25
1 列的最大值值为 90
---------------------------------------
2 列的平均值为 36.50
2 列的最大值值为 67
---------------------------------------
3 列的平均值为 49.25
3 列的最大值值为 97
---------------------------------------

二维数组

char a [3][4];
//标识符优先跟谁结合: a[3] ----->数组,长度表示元素的个数,表示有3个元素
//数组的元素的类型 char [4]------>数组类型 ,a[0] a[1] a[2]
//合称:数组的数组,---->二维数组
//数组名:表示数组首行地址

#include <stdio.h>
int main()
{
	char a[3][4] = {10,11,23,45,
				   89,90,67,55,
				   99,88,56,97
				   };
    int i,j;

	//数组名:表示数组的首行地址,指向的对象的类型元素 char [4]类型
	//a+1 :  偏移一整行
	//a+i :  偏移i行,表示i行的首地址 char [4]
	// *(a+i) : 表示i行的首列元素的地址
	//**(a+i): 表示i行首列元素的内容


	printf("%d\n",**a);
    printf("%d\n",**(a+1));
    // *(a+i)+j : 表示i行的j列元素的地址
	//*(*(a+i)+j): 表示i行j列元素的内容
	
    //a[0] :  类型为数组类型,char [4],相当于一维数组的首元素的地址
			  //a[0] 是元素a[0][0]的地址,指向的对象的类型为char 类型
	//a[0]+1 : 偏移一个字节,也就是 a[0][1]元素的地址
	//a[i]+j : 表示i行j列元素的地址
	//*(a[i]+j)  : 表示i行j列的元素, 等价于a[i][j]
    //a[i]  : 表示i行首列元素的地址

    printf("%#p\n",a);
    printf("%#p\n",a+1);

     printf("%#p\n",a[0]);
     printf("%#p\n",&a[0][0]);

     printf("%#p\n",a[0]+1);
     printf("%#p\n",&a[0][1]);

	 printf("%d\n",*a[0]);
	 printf("%d\n",*(a[0]+1));

    printf("--------------------------------\n");
	for(i = 0; i < 3; i++)
	{
		for(j = 0; j < 4; j++)
		{
			//printf("%d ",a[i][j]);
			//printf("%d ",*(a[i]+j));
			  printf("%d ",*(*(a+i)+j));
		}
		printf("\n");
	}
}

输出结果
[csy@local array_two]$ ./array_two2
0xbfa336ec
0xbfa336f0
0xbfa336ec
0xbfa336ec
0xbfa336ed
0xbfa336ed
10
11
--------------------------------
10 11 23 45 
89 90 67 55 
99 88 56 97 

在这里插入图片描述

发布了65 篇原创文章 · 获赞 36 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40860986/article/details/95257203