二维数组:
矩阵的表示形式
多个一维数组组成二维数组
二维数组的定义:
定义格式:数据类型 数组名[长度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