数组 | C++入门详解,一起来学习!

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 112 浏览




C++

数组

【定义】

·数组是相同类型数据的有序集合。

·数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。

·其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。


【基本特点】

·其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。


·其元素必须是相同类型,不允许出现混合类型。


数组中的元素可以是任何数据类型,包括基本类型和引用类型。


·数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

1

一维数组

1.1定义方式

·数据类型 数组名[数组长度];

·数据类型 数据名[数组长度]={值1,值2…};

·数据类型 数组名[ ]={值1,值2…};


1.2数组特点

放在一块连续的内存空间

数组中每个元素都是相同的数据类型

图片
图片
图片


1.3一维数组数组名

用途

统计整个数组在内存中的长度

可以获取数组在内存中的首地址

图片
图片


例1:数组元素逆置

请声明一个5个元素的数组,并且将元素逆置

图片
图片
图片


1.4数组的创建

数组是一组相同类型元素的集合。

数组的创建方式:

图片


例如我们想要存储10个int类型的数据

这时我们就可以创建一个数组来存储

即:int  arr[10]

注:数组创建,在C99标准之前,[ ]中要给一个常量才可以,不能使用变量,但是在C99中引入了变长数组的概念,变长数组支持数组的大小使用变量来指定,(变长数组不是数组的长度可以变化)。注意:变长数组不能初始化。


数组创建的例子:

图片


1.5数组的初始化

数组的初始化是指

在创建数组的同时给数组的内容

一些合理初始值(初始化)

图片

两个初始化的比较:

图片
图片

 在监视中我们发现ch1和ch2中存储的数据是一样的,但是其实他们的性质不同,ch1中第一个元素初始化为'a',第二个元素初始化为 'b',第三个元素初始化为'c',其余的元素默认初始化为0,而ch2中第一个元素初始化为'a',第二个元素初始化为'b',第三个元素初始化为'c',第四个元素初始化为'\0'(相当于0),其余元素默认初始化为0。

1.6一维数组的使用

在这里我们要知道一个操作符:[ ]

下标引用操作符

它其实就是用来访问数组的操作符

我们需要知道数组的每一个元素

都有对应的下标

并且数组的下标是从0开始的

例如有一个数组

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

图片

我们访问元素通过下标来访问

例如我们要访问数组的第5个元素

我们就可以使用arr[4]来访问

我们可以将数组的每一个元素打印出来:

图片

注:在这里的arr[i]表示数组的一个元素,而不是创建数组,访问数组元素可以使用变量。


【总结】

·数组是使用下标来访问的

下标是从0开始的

·数组的大小可以通过计算得到

即int sz = sizeof(arr) / sizeof(arr[0])


1.7一维数组在内存中的存储

我们要探讨一维数组在内存中的存储

就要看一维数组各元素的地址

图片
图片
图片

如图数组在内存中是连续存放的


【总结】

随着 数组下标的增长

元素的地址

也在有规律的递增

数组在内存中是连续存放的

图片

2

二维数组

2.1定义类型

·数据类型 数组名[行数] [列数];

·数据类型 数组名[行数] [列数]={{数据1,数据2},{数据3,数据4}};

·数据类型 数组名[行数] [列数]={数据1,数据2,数据3,数据4};

·数据类型 数组名[ ] [列数]={数据1,数据2,数据3,数据4};

图片
图片
图片


2.2二维数组数组名

图片
图片


2.3二维数组的使用

二维数组的使用也是通过下标的方式

我们可以使用两种方式打印出来

二维数组的元素:

按行打印:

图片
图片

按列打印:

图片
图片


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

要了解二维数组在内存中的存储

我们依然要去分析数组元素的地址

图片
图片

我们发现在内存中二维数组依然是连续存储的,即:

图片

【总结】

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

图片

3

数组越界

数组的下标是有范围限制的。


数组的下标是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。


所以数组的下标如果小于0,或者大于n-1,就是越界访问了,超出了数组合法空间的访问。


c语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,不代表程序是正确的,我们在写代码时需要自己做越界的检查。

越界会出现什么后果呢?

我们可以举例来看:

图片
图片

上述就是列越界的例子,会导致数组的读取紊乱,相当于:

图片

4

数组作为函数参数

在这里我们具体使用冒泡排序的例子来讲解 :

我们想要实现一个冒泡排序函数将一个整型数组排序。

冒泡排序的思想:
     两两相邻的元素进行比较,如果他们的顺序错误就把他们交换过来。一趟冒泡排序(把一组待排序的元素里面相邻的两个元素进行比较并且按照要求进行交换)之后最后一个位置放的是最大(最小)的数。

图片

4.1冒泡排序函数的错误设计

图片
图片

我们发现代码会报错

图片

我们来分析错误原因:

图片

所以在这里我们知道是由于数组名传参的时候传递的是首元素的地址导致sz无法计算最终程序错误。


4.2冒泡排序函数的正确设计

上述代码错误是由于sz在自定义函数内部的计算错误,那么我们可以根据此处改进:

图片
图片

我们直接将sz的值传参过去,避免了在自定义函数内部的计算。


4.3数组名是什么

数组名是首元素的地址(有两个例外)。

1.sizeof(数组名),计算整个数组的大小,数组名表示整个数组,单位是字节。

2.&数组名,数组名表示整个数组,取出的是整个数组的地址。

除了上述情况以外,所有的数组名都表示数组首元素的地址。

在这里,我们介绍一下上述2与其他的区别:

图片

数组的地址也是首元素的地址所以这里相同。

不同:

图片
图片


添加 家长论坛微信 



发布于 2024-04-21 15:46

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

All Rights Reserved Powered BY WeCenter V4.1.0 © 2026 京ICP备20005761号-2