二維數組:
矩陣的表示形式
多個一維數組組成二維數組
二維數組的定義:
定義格式:數據類型 數組名[長度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