C语言的数组第二章二维数组与数组越界

二:二维数组的创建和初始化

2.1二维数组的创建

2.2二维数组的初始化

2.4二维数组在内存中的储存

三.数组越界

上一章学习了一维数组的创建和初始化,二维数组和一维数组本质上是差不多的,所以掌握一维数组就能较容易的学会二维数组,那么下面我们一起进入对二维数组的学习吧。

2.1.二维数组的创建

//数组的创建
int arr[3][4];
char arr[3][4];
double arr[3][4];
//[]中的数字代表这个二维数组是3行4列的

2.2.二维数组的初始化

#include<stdio.h>
int main()
{
int arr[3][4]={1,2,3,4};//因为这个二维数组是三行四列的,从大括号内第一个元素开始排列,不足的用0代替
return 0;
}

我们可以得到:
在这里插入图片描述
如果我们想要将上面这个二维数组大括号内的元素排列在的每行前两个位置上:

#include<stdio.h>
int main()
{
int arr2[3][4]={{1,2},{3,4}};
return 0;
}

在这里插入图片描述

需要注意的是:二维数组如果有初始化,可以省略,但是不可以省略。
如:

#include<stdio.h>
int main()
{
int arr3[][4]={{1,2},{3,4}};//在行省略的情况下,二维数组会根据大括号内列的排列判断出行数
return 0;
}

在这里插入图片描述
那么我们有个问题,那就是为什么行可以省略,列不可以省略呢?
我们可以把二维数组看成由多个一维数组组成的,我们只有在确定每个一维数组存放多少个元素才能确定二维数组。假设我们省略列,那么操作系统就不知道每个一维数组分配多少个元素,从而造成二维数组的混乱。所以只有确定了列数,操作系统才能正确分配出二维数组。

2.3二维数组的使用
二维数组的使用也是通过下标的方式实现的。

#include<stdio.h>
int main()
{
int arr4[][2]={1,2,3,4,5,6,7,8,9};//根据二维数组的定义可得,该二维数组是五行两列的
int i=0;
for(i=0;i<5;i++)
{
  int j=0;
  for(j=0;j<2;j++)
  {
     printf("%d ",arr4[i][j]);
  }
  printf("\n");
}
return 0.
}

结果可得:
在这里插入图片描述

2.4二维数组在内存中的储存

#inclide<stdio.h>
int main()
{
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i=0;
for(i=0;i<3;i++)
{
   int i=0;
   for(j=0;j<4;j++)
   {
     printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
   }
}
return 0;
}

在这里插入图片描述
十六进制,每个元素之间也相差四个字节

二维数组在内存中也是连续存在的。

#include<stdio.h>
int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 0;
	for (i = 0;i < 3;i++)//求行数我们也可以写成sizeof(arr)/sizeof(arr[0])
	{
		int j = 0;
		for (j = 0;j < 4;j++)//求列数可以写成sizeof(arr[0])/sizeof(arr[0][0])
		{
			printf("%d ", arr[i][j]);
		}
	}
	printf("\n");

	int* p = &arr[0][0];
	int k = 0;
	for (k = 0;k < 12;k++)
	{
		printf("%d ", *(p + k));
	}

	return 0;
}

结果为:
在这里插入图片描述
无论是通过下标还是地址都可以打印出来。
二维数组也可以看成一维数组组成的。

三.数组越界
数组的下标是有限制的。
数组的下标是从0开始的,如果数组有n个元素,则最后一个元素的下标是n-1.
所以数组的下标如果小于0,或者大于n-1的话,就属于研越界访问了,超出了合法的空间访问。

错误如下:

#include<stdio.h>
intmain()
{
int arr[10]={0};
//0~9
int i=0;
for(i=0;i<=10;i++)
 {
   printf("%d ",arr[i])
 }
return 0;
}

在这里插入图片描述
打印最后一个不是范围内的值,而是打印出了一个随机值,但是编译器并没有报错。虽然编译器没有报错,但是并不能说明程序是正确的。所以看到类似情况,就应该自己检查出数组越界的问题。

至此结束,感谢各位佬纠错在这里插入图片描述

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓娃也不e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值