数组3——二维数组

勤勉的文章连接:数组1数组2

目录

二维数组的简单介绍

二维数组的初始化

二维数组的使用

                      内存中的二维数组


二维数组的简单介绍

之前的文章谈到了一维数组,和一些使用技巧,这里来聊一聊二维数组

先来看看我们假想中的一维数组

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3]={0};
	return 0;
}

那么我们眼中的认为数组是

 那么二维数组就应该是这样的

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][2];
	return 0;
}

 二维数组分行和列,例如这是三行两列的一个二维数组,期中每个元素都是Int型

当然,你也可以这样创建二维数组

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	char arr[3][2];
	return 0;
}

这样就创造了一个char型的二维数组,其中二维数组里面每一个元素均为char型

二维数组的初始化

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][2] ={1,2,3,4,5,6};
	return 0;
}

按下F10调试一下

 大家可以看到二维数组里的内容,用我们想象的图来表示就应该是这样

 

不完全初始化

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][2] ={1,2,3,4};
	return 0;
}

后续未初始化的补0

从调试窗口可以直接看出来 ,如果是字符数组,那么后面补的应该是‘\0’

再看另一种初始化

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][2] = { {1},{2},{3} };
	return 0;
}

调试一下,查看数组内部到底是放了什么

 把一个二维数组当作及格一维数组,也就是说,如果你需要单独个二维数组中的每一行赋值,可以使用这种方法

当然我可以更改一下代码

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][] = { {1},{2},{3} };
	return 0;
}

这是二维数组中错误的省略方式,

 

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[][2] = { {1},{2},{3} };
	return 0;
}

 这样却可以完美运行,通过这样两段代码,大家又懂了什么,初始化二维数组中行可以省略,但是列是不能省略的。

原因的话,我会在文章稍后进行讲述

二维数组的使用

使用之前使用的代码

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int arr[3][2] ={1,2,3,4,5,6};
	return 0;
}

二维数组和一维数组类似,都可以通过下标来进行访问,可以理解为数学中的x,y轴

 假设我想输出数组中的3,3在数组的第二行,第一列中

 那如果想全部打印就应该这样做——灵活使用for循环

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int i, j;
	int arr[3][2] = { 1,2,3,4,5,6 };
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 2; j++) {
			printf("%d",arr[i][j]);
		}
		printf("\n");
}
	return 0;
}

这段代码可能会让初学者有些难以理解,这里简单解释一下,i表示行,j表示列

i=0时,j=0之后i=0,j=1这样通过两个for循环使用二维数组

内存中的二维数组

那么大家看一下二维数组在电脑内存中的储存,当然这里的代码只需要大家了解就行,之后在我讲述指针之后回头来看这段代码应该会很清楚。这里就简单介绍一下在电脑内存中二维数组如何储存

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
#include<string.h>
int main() {
	int i, j;
	int arr[3][2] = { 1,2,3,4,5,6 };
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 2; j++) {
			printf("arr[%d][%d]=%p",i,j,&arr[i][j]);
		}
		printf("\n");
}
	return 0;
}

 

 在电脑内存中,属猪以16进制的方式储存,从这里可以清晰的看出,arr[0][0]和arr[0][1]相差4

后续的相邻的数组也是相差4。这里我来给大家解释一下原因,因为数组是int型,所以每个数组中的元素在内存中占了4个字节。

回到之前谈到过的问题,为什么二维数组中可以省略行不能省略列。

这里画一下这段代码在计算机真正储存时的空间

 他其实在内存中是横向排列的,假设你不定义列数,也就是没有定义一行有几个数话,计算机就无法无法确定列数,就形成不了二维数组

以上就是二维数组的所有知识点了,希望大家在接近期末能在看完这篇文章后完全了解二维数组

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值