重溫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 

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章