二维数组的初识及初始化
二维数组定义的形式是数组名[常量表达式][常量表达式] 。本质上多维数组与一维数组是一样的,他们在内存中是线性排列的,这里对多维的定义实际上是反复递归对一维的定义,即N维数组是一个集合,包含多个元素,每个元素又是一个N-1维数组。
对于多维数组,我们约定方括号越往左边成为高维,越往右边称为低维,最左边的是第一维,其每一维的长度由方括号内的常量表达式决定,如a[3][4],表示有三个一维数组,每个一位数组里有4个元素.
让我们看下面的这个例子:
#include<stdio.h>
int b[4][4]; //在函数体外定义的全局变量自动初始化为零
int main(void)
{
int a[4][4] = {{1},{1,2},{1,2,3},{1,2,3,4}}; //在函数体内定义的变量需要自己初始化,注意多维数组初始化的格式
int i , j ;
for(i = 0; i <= 3; i++ )
{for(j = 0; j <= 3; j++ )
printf("a[%d][%d] %d ", i , j, a[i][j] );
}
for(i = 0; i <= 3; i++ )
{for(j = 0; j <= 3; j++ )
printf("b[%d][%d] %d ", i , j, b[i][j] );
}
return 0;
}
对于多维数组的初始化,我们有两种方法一种是按多维数组初始化,另外一种是按一维数组初始化。
另外,在函数体内初始化和在函数体外初始化也是不同的,在上面的例子中,在函数体外定义的b数组自动初始化为零,不需额外操作,而在函数体内定义的a数组则需要自己初始化,要注意多维数组初始化的格式。并且,在函数体内定义的数组如果只初始化了一部分,剩下的元素都会被初始化为零。
在已经给出初值列表的情况下,定义多维数时可以不用说明第一维数组的长度,编译器会根据列出的元素自动给出能容纳元素的最小数组长度。
二维数组的引用与遍历
#include<stdio.h>
int main(void)
{
int i , j , n ;
printf("Please input how many dimensional array you want to create\n");
scanf("%d",&n);
int a[n][n] ;
printf("Please input your Multidimensional array\n");
for(i =0 ; i < n ; i++ )
for(j =0 ; j < n ; j++ )
scanf("%d",&a[i][j]);
printf("\n");
for(i =0 ; i < n ; i++ )
{for(j =0 ; j < n ; j++ )
{printf("%d ",a[i][j]);
if(j == n-1)
printf("\n");
}
}
return 0;
}
在引用二维数组时,和一维数组一样,我们不能直接引用整个数组,而是只能引用其中的元素,要注意每个元素的下标。
#include<stdio.h>
int main(void)
{
int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} ;
int i , j , sum ;
//主对角线元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{j = i ;
printf("%d ", a[i][j] );
sum += a[i][j] ;
}
printf("\n主对角线元素之和为%d\n",sum) ;
//副对角线元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{j = 3-i ;
printf("%d ", a[i][j] );
sum += a[i][j] ;
}
printf("\n副对角线元素之和为%d\n",sum) ;
//左上三角元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{for( j = 0 ; j < 4-i ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n左上三角元素之和为%d\n",sum) ;
//左下三角元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{for( j = 0 ; j < i+1 ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n左下三角元素之和为%d\n",sum) ;
//右下三角元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{for( j = 3-i ; j < 4 ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n右下三角元素之和为%d\n",sum) ;
//右上三角元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{for( j = i ; j < 4 ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n右上三角元素之和为%d\n",sum) ;
//内部元素遍历
for( sum = 0 , i = 1 ; i < 3 ; i++ )
{for( j = 1 ; j < 3 ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n内部元素之和为%d\n",sum) ;
//外部元素遍历
for( sum = 0 , i = 0 ; i < 4 ; i++ )
{for( j = 0 ; j < 4 ; j++ )
{printf("%d ", a[i][j] );
sum += a[i][j] ;
}
}
printf("\n外部元素之和为%d\n",sum) ;
return 0;
}
通过对下表的条件限制,我们可以实现对二维数组中元素的遍历,进而实现求和求积等操作。