数组(从小白进阶大白的第四天)

本文详细介绍了C语言中数组的基础概念,包括一维数组的创建、初始化、类型以及使用方法,如下标访问、元素打印和输入。还探讨了二维数组的创建、初始化、内存存储结构,以及sizeof关键字在计算数组元素个数的应用。
摘要由CSDN通过智能技术生成

1. 数组的概念

数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个就称为数组名。 数组是⼀组相同类型元素的集合;
数组是⼀组相同类型元素的集合,从这个概念中我们可以发现:1.数组中存放的是1个或者多个数据,但是数组元素个数不能为0。2.数组中存放的多个数据,类型是相同的。
数组分为一维数组和多维数组,多维数组一般都是二维数组。

2. ⼀维数组的创建和初始化

2.1 数组创建

一维数组基本语法如下图所示:

存放在数组中的值被称为数组中的元素,在创建的时候我们可以指定数组的大小和元素类型。

例如我们想要储存5个班级的量化考核成绩,那我们就可以创建一个数组来进行储存。

double grade[5]

当然,我们可以依据需求来创建其它类型的数组:

char ch[5];         int math[10]; 

2.2 数组的初始化

在我们创建数组的时候,一般都会给定数组一些初始值,这个过程我们称为初始化。

如下图所示:

2.2 数组的初始化

2.3 数组的类型

在上文,我们涉及到了数组的不同类型。

例如:

char ch[5];
int arr1[10];
double arr2[20];
所以我们可以知道:数组也是有类型的,数组算是⼀种自定义类型,去掉数组名留下的就是数组的类型。

3. ⼀维数组的使用

上文我们学习了一维数组的基本语法,一维数组可以存放数据,存放数据的⽬的是对数据的操作,那我们如何使⽤⼀维数组呢?

3.1 数组下标

在C语⾔中数组的访问提供了⼀个操作符,这个操作符叫:下标引⽤操作符

int arr[10] = {1,2,3,4,5,6,7,8,9,10}
我们就以上述代码来充当例子。
3.1 数组下标
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,我们可以使⽤下标引用操作符  ,想要访问下标是3的元素,就可以使⽤ arr[3]。
3.1 数组下标

3.2 数组元素的打印

如果我们想要访问整个数组的内容,那怎么办?

只要我们拥有数组所有元素的下标就可以了 ,我们可以使⽤for循环产⽣0~9的下标,接下来使⽤下标访问就行了。
3.2 数组元素的打印

3.3 数组的输入

明白了数组的访问,我们也可以根据自己的需求,自己给数组输入想要的数据,如下:
3.3 数组的输入

4. ⼀维数组在内存中的存储

我们有了之前的知识,使用数组基本上没有问题了,如果想要深入了解数组,我们还是从数组在内存中的储存开始学习。

#include <stdio.h>

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

我们可以取地址上述代码数组中的元素:

4. ⼀维数组在内存中的存储

从输出我们可以分析出,随着数组下标的增长,数组元素的地址四从小到大变化的,并且我们可以看出,每两个相邻元素地址差4(因为int是4个字节)。所以我们得出一个结论:数组元素在内存中是连续存放的。这就位以后我们使用指针来访问数组奠定了基础。

5. sizeof计算数组元素个数

在我们进行数组的学习时,我们经常想知道数组的元素个数,于是C语言给我们提供了sizeof用来计算元素个数。

sizeof:是C语言中的一个关键字,它可以用来计算类型或者变量大小。所以,我们使用sizeof来计算数组的大小。例如以下代码:

5. sizeof计算数组元素个数

需要我们注意的是,这里输出的40是数组占内存空间的总大小,他的单位是字节。

如果我们想知道数组中具体的元素个数,我们可以使用sizeof(arr) / sizeof(arr[0])。这是因为数组中元素类型都是一样的,我们只要知道一个元素的字节大小,数组元素个数就可以轻松的计算出来。

那怎么计算一个元素所占字节大小?我们可以参考以下代码:

5. sizeof计算数组元素个数

有了一个元素所占字节的大小,我们就可以计算出数组中的元素个数。

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d", sz);
	return 0;
}
5. sizeof计算数组元素个数

6. 二维数组的创建

6.1二维数组的创建

前面学习的数组都是一维数组。如果我们将一维数组作为一个新数组中的元素,那这个新数组就可以称为二维数组。同理,将二位数组作为一个新数组的元素,那这个新数组就可以称为三维数组。二维及二维以上的数组都被称为多维数组。

二维数组

6.2二维数组的创建

那我们如何定义二维数组呢?

6.2二维数组的创建

7. 二维数组的初始化

我们在创建二维数组的时候,给定二维数组一些初始值,这个就叫做二维数组的初始化。那我们该如何给定二维数组值呢?会不会跟一维数组一样?

7.1完全初始化

二维数组进行初始化的时候,跟一维数组一样,也是使用大括号初始化的。

#include <stdio.h>

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	return 0;
}
完全初始化

8. 二维数组的使用

8.1二维数组下标

我们在初步了解二维数组的初始化后,那我们该如何访问二维数组中的元素的呢?

其实二维数组的访问也是通过下标来进行的,二维数组是由行和列的,只要锁定了行和列就能确定唯一的一个元素。C语⾔规定,二维数组的行和列是从0开始的。
#include <stdio.h>

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	return 0;
}

那上面数组中的元素就可以使用下标来确定了:

二维数组的使用

我们在了解下标后,是否有一个疑问——在我们对二维数组进行初始化的时候,二维数组的行和列的数值是否都需要给定?

8.2按照行初始化

我们先尝试将行的值省略:

8.2按照行初始化

编译器没有报错,这就证明我们可以省略行的数值。我们将这个二维数组打印出来:

8.2按照行初始化

8.3初始化时省略行,但是不能省略列

8.3初始化时省略行,但是不能省略列

在上图中,我们对数组进行了初始化省略行,我们将arr1打印出来,对其进行观察。

8.3初始化时省略行,但是不能省略列

9. 二维数组在内存中的存储

像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素的地址的。代码如下:
#include <stdio.h>

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

他的输出结果如下:

9. 二维数组在内存中的存储
从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。

我们可以用图来描述一下:

9. 二维数组在内存中的存储

这也可以解释8.3为什么只能省略行而不能省略列的。了解清楚⼆维数组在内存中的布局,有利于我们后期使⽤指针来访问数组的学习。

以上是在我的环境下展示出来的结果,如有错误,请给予指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白只会写bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值