【c语言】二维数组的概念与使用(例题分析)

一: 一般格式:


存储类别 类型说明符 数组名 [常量表达式1] [常量表达式2]
说明;类型说明符可以是任意数据类型或构造数据类型,数组名就是我们定义的标识符.
常量表达式1的值表示第一维元素的个数,也称为"数组的长度".

常量表达式2的值就是第二维元素的个数。

例如:

static int a[4][3];
double b[4][3];
char c[3][4];
float c[4][3];

 二:二维数组元素的表示形式:

一般表示形式:
数组名 [下标1] [下标2]
在知道其表示含义前,先介绍二维数组元素的存储

我们打印a[3][4],它会输出任意值

#include<stdio.h>
#define N 3
#define M 4
int main()
{
	int i,j,arr[N][M];
    for(i=0;i<N;i++)
	{
		for(j=0;j<M;j++)
		{
			printf("a[%d][%d]=%d\t\t",i,j);
		}
	}
	printf("\n");
}


计算机的存储器是连续偏址,也就是说存储单元按一维存储
那么,存储二维数组,我们采取,先存储完前一行再存储下一行
我们就引入行列式(矩阵)

例如:
我们定义一个数组 int a[3][4]

第一列

a[ ][0]

第二列

a[ ][1]

第三列

a[ ][2]

第四列

a[ ][3]

第一行a[0][ ]a[0][0]a[0][1]a[0][2]a[0][3]
第二行a[1][ ]a[1][0]a[1][1]a[1][2]a[1][3]
第三行a[2][ ]a[2][0]a[2][1]a[2][2]a[2][3]

每个元素占2个字节,共有12个元素,即占24个字节

 我们就阵来看待可以用数学当中的矩二维数组的表示形式
"常量表达式一"代表行数,"常量表达式二"代表列数
数据放完第一行后,再存储在下一行

 定义 int a[2][3]
它的元素个数及表达为为:
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
a[2][0],a[2][1],a[2][2]

个数=常量表达式1*常量表达式2

 三:初始化二维数组的不同形式


NO.1 将所有元素的初始值有次序的放在一个花括号内,并用逗号相隔开,如:

static b[2][2]={1,2,3,4}
//等价于:
b[0][0]=1,b[0][1],b[1][0],b[1][1]

NO.2 每行的数据依次放在花括号内,再将各行的数据用逗号隔开放在最外层的花括号中,如:

static c[2][2]={{1,2},{3,4}}
//等价于NO.1的1例子b[2][2]


这样更为直观,符合二维数组的特点

NO.3 未赋值的元素自动取零或空字符(字符组),如;

static d[2][2]={{1},{2,3}
//等价于:
d[0][0]=1,d[0][1]=0
d[1][1]=2,d[1][2]=3

NO.4 若所有元素要赋值,第一维的长度可以不用给出,但第二位的长度要给出,如:
static e[ ][2]={1,2,3,4}
第二维的长度为2,即有2列数,共有4个初值,就可以得出有2行数
即等价于:

e[0][0]=1,e[0][1]=2
e[1][0]=3,e[1][1]=4

 三:引用二维数组元素

其一般格式:
数组名[下标][下标]
说明:下标的值是整数或整型表达式

引用二维数组的常见错误:

NO.1 
a[2-1][2*2-1]不能写成a[2,3]或a[2-1,2*2-1]


NO.2

使用数组元素时应注意下标值在已定义的数组大小的范围内,如:
 

int a[2][2];
a[2][2]=1;//没有此元素

 四:典例


一:将一个二维数组a的行和列的元素互换,保存到另一个二维数组b中
   1 2 3        1 4       
a=[      ]   b=[2 5]
   4 5 6        3 4

分析:关键在于在循环语句中将b[j][i]的值赋值给a[i][j]

#include<stdio.h>
int main()
{
	int  a[2][3]={{1,2,3},{4,5,6}};//按题目要求定义数组并赋值
	int b[3][2],i,j;
	printf("array a\n");
	for(i=0;i<2;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%5d",a[i][j]);//用两个循环语句输出a的数组
			b[j][i]=a[i][j];//将a[i][j]的值赋值给b[j][i]
		}
    printf("\n");
	}
	printf("array b:\n");
	for(j=0;j<3;j++)
	{
		for(i=0;i<2;i++)
		
			printf("%5d",b[i][j]);//用两个循环语句输出题目要求的b数组
		
		printf("\n");
		
	}
}

打印如下杨辉三角
1
1 1
1 2 1
1 3 3  1
1 4 6  4  1
1 5 10 10 5 1 
分析:第一列和斜对角线的值都为1,如题,
可以看出i=2,j=1开始的值都符合此公式
a[i][j]=a[i-1][j-1]+a[i-1][j]

#include<stdio.h>
#define N 6
int main()
{
int a[N][N]={0};
int i=0,j=0;
for(i=0;i<6;i++)
{
	a[i][0]=1;
	a[i][i]=1;//定义数组且将第一列和斜对角线的元素都赋值为1
}
for(i=2;i<N;i++)
{
	for(j=1;j<i;j++)
	{
		a[i][j]=a[i-1][j-1]+a[i-1][j];//用两个for语句将i>=2,j>=1的元素用此公式赋值
	}
}
for(i=0;i<N;i++)
{
  for(j=0;j<=i;j++)
  {
	 printf("%5d",a[i][j]);//用for语句输出题目要求的二维数组
  }
  printf("\n");
}

}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值