【C语言】数组详解

本文详细介绍了数组的基础概念,包括一维和二维数组的创建、初始化规则、内存存储特性,以及一维数组的应用实例,如输入输出和sizeof操作。此外,还展示了如何实现简单的二分查找算法作为实践案例。
摘要由CSDN通过智能技术生成

一、数组的概念

数组是一组相同类型元素的集合,有这个定义我们能知道一下两点:

①数组中能够存放一个或多个数据,但不能是0个

②数组中的所有数据的数据类型是一样的

数组分为一维数组和多维数组,多维数组中二维数组比较常见,我们主要讲解这两种数组

二、一维数组

1.一维数组的创建和初始化

数组的初始化及要点

对于数组初始化,我们都需要用{}括起来,用,将每个元素分开。

而这种情况我们是对数组中每一个元素都初始化了,这种初始化叫作完全初始化。那么同时也会有不完全初始化

像这样只初始化部分元素,就是不完全初始化。那么对于那些我们没有初始化的元素编译器会给那些元素自动初始化,让他们的值为0。

那么对于完全没有初始化的数组,编译器会给数组元素自动初始化为0吗?答案是不会,是随机值

在初始化中有以下几点要注意:

①数组初始化时存放的元素的个数不能超出那个常量值,否则会报错

②数组初始化时可以在[]中不放常量,编译器会自动为该处放入你初始化时元素个数的值

可以看到我们没有在[]中放常量,但自动有了arr[6],但记住必须要初始化,且初始化后代码上虽然没有值,但编译器会认为这里有值,要清楚的知道该处的值是多少,在之后使用时不要越界


2.一维数组的使用

我们了解了如何创建并初始化一维数组,那么如何使用一维数组呢?

在一维数组中存在下标,如果数组中有n个元素,则下标从0开始一直到n-1

现在,我们了解一下数组元素与数组下标(数组[]中数字的关系)

在访问数组中的元素时,我们通过使用下标引⽤操作符[ ]访问该处元素

[ ]左边是数组名,里面是下标数值,在了解到这之后,还有一种特殊的初始化

 数组初始化可以跳过前面的元素,对特定的那个元素开始初始化

3.一维数组在内存中的存储

我们之前创建变量,各变量是随机存储的,那么数组中个元素也是随机存储吗?

在数组中各元素是按顺序紧挨着连续存储的

通过代码也能直观体现这一特点

我们能看到相邻两个地址相差4个字节,这刚好是int类型的大小

4.一维数组的其他应用

①一维数组的输入输出

在前面的代码中,我进行数组的输出时都是使用了循环来输出。这是由于我们可以通过数组下标访问数组的元素从而对该元素进行输入输出,且因为当数组元素个数过多时,一个一个输入输出很麻烦,不如用循环简洁明了

这就是一个一个输入,看着就麻烦,而且当个数增大,如100,1000等,想想就头大

这是使用循环输入,即使元素个数增大,只需要将10改成对应数字就行

②sizeof求数组元素个数

当我们在使用数组时想要通过编译器知道数组元素个数,确保准确无误,要怎么做呢?

首先介绍一下sizeof,sizeof() 在()中可以放变量名,数据类型等,可以知道这个变量或者数据类型的大小是多少字节,例如:sizeof(数组名)就可以知道数组的大小是多少字节,在此基础上,我们可以求出数组中一个元素的大小sizeof(数组名[0]),将整个数组的大小除以数组中一个元素的大小就可以知道数组中有多少个元素

三、二维数组

1.二维数组的创建和初始化

例如:

type是数组中元素的数据类型,arr_name是数组名

数组名后第一个[]里的常量指行数,arr1[3][3]中就有3行

数组名后第二个[]里的常量指列数,arr2[3][3]中每一行有3列

二维数组中所有元素的总个数 == 行数 * 列数,例如:arr1中元素个数 == 3 * 3 == 9

二维数组也可以像一维数组那样按顺序初始化每一个元素

当我们这样初始化时,会先初始化第一行的元素,当第一行元素全部初始化后,然后第二行...... 直至所有元素全部初始化,若有元素没有初始化则自动初始化为0;

二维数组也可以单独对每一行初始化

我们可以在{}中在使用{},第一个{}中的数值只初始化第一行的元素,第二个{}中的数值只初始化第二行的元素......   像我们第一行只初始化了3个元素,但第一行有6个元素,则后面3个元素自动为0

注意:在一维数组我们有可以不在[]中加入常量的初始化,但在二维数组中,只能在第一个[]中不加入常量,在第二个[]中一定要有常量

在第一个[]中,编译器依然会自动加入符合初始化的常量值,要清楚知道是多少,别使用时越界访问

2.二维数组的使用

由于二维数组中的元素具体到行和列,所以我们使用时也要包含列和行的信息

例如:打印arr1中的所有元素的值

这输出也证明了不使用{}括起来表示行是从小到大按顺序初始化;

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

我们将二维数组的元素分为行和列,那么在存储二维数组时,编译器也会将其中的元素地址按行和列来存储吗?答案显然不会,而是在存储完一行元素后紧接着在后面存储下一行元素。

我们在编译器中输出二维数组中的所有元素地址也能通过数字清楚发现这一现象

同一行相邻两个元素地址相差4个字节,是元素int类型的大小,而每一行最后一个元素地址与下一行第一个元素地址的值也是相差4,int类型的大小,所以二维数组在存储中是连续存放。

六、数组练习

我们通过写一个二分查找的算法。

二分查找是什么?当我们有一组有序的数据时,我们可以不断地查找中间值,判断该值与我们想要查找的值的大小关系,将原本需要遍历查找的算法优化成一次查找省去一半的查找,这就是二分查找,我在这里举个例子来理解一下二分查找的流程:

通过这个流程图,我们能写出二分查找的伪代码:

①我们需要一个数组存储得到的有序数据,并输入我们要查找的数number

②用一个变量left表示查找的左边界,一个变量right表示查找的右边界,一个变量middle表示我们要查找的中间数的下标

③通过一个循环来重复查找,如果middle表示的中间数小于number,则使左边界改变,让left = middle + 1;如果middle表示的中间数大于number,则使右边界改变,让right = middle - 1;当找到需要查找的数则返回该数下标,即middle;如果没找到,通过不断使左或右边界改变,在最后会使得左边界大于右边界,此时退出循环,打印没找到。

总结

在这篇文章中,我们讲解了数组中的一维数组和常用的二维数组,并附带了在数组中能够写出的简单的二分查找算法,对于数组在函数中的应用将在函数中讲解,数组与指针的关系在指针中讲解,这是我对于只是数组知识的有关讲解,希望对大家有所帮助,若有出错请大佬指正,小萌新感激不敬。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值