数组是存储在连续内存位置的项目的集合。这个想法是将多个相同类型的项目存储在一起。这使得通过简单地将偏移量添加到基值,即数组的第一个元素的内存位置(通常由数组的名称表示)来更容易地计算每个元素的位置。基值是索引 0,两个索引之间的差值是偏移量。
为简单起见,我们可以将数组视为一组楼梯,其中每一步都放置了一个值(假设您的一个朋友)。在这里,您可以通过简单地知道他们所走的步数来识别任何朋友的位置。
请记住:“下一个索引的位置取决于我们使用的数据类型”。
上图可以看作是楼梯的顶层视图,您位于楼梯底部。每个元素都可以通过它在数组中的索引来唯一标识(与您可以通过上面示例中的朋友所在的步骤来标识您的朋友的方式类似)。
数组的大小
在 C 语言中,数组具有固定大小,这意味着一旦给定了大小,它就无法更改,即您不能缩小它,也不能扩展它。原因是为了扩展,如果我们改变大小,我们不能确定(每次都不可能)我们是否可以免费获得下一个内存位置。收缩将不起作用,因为数组在声明时会静态获取内存,因此编译器是唯一销毁它的人。
数组中的索引类型 :
0(从零开始的索引):数组的第一个元素由下标 0 索引。
1(从一开始的索引):数组的第二个元素以 1 的下标进行索引。
n(基于 n 的索引):可以自由选择数组的基本索引。通常,允许基于 n
的索引的编程语言也允许负索引值,并且其他标量数据类型(如枚举或字符)可用作数组索引。
C++代码
#include <iostream> using namespace std; int main() { // 创建一个大小为 10 的名为 arr 的整数数组。 int arr[10]; // 访问 0 索引处的元素并将其值设置为 5。 arr[0] = 5; // 在 0 索引处访问和打印值,我们得到输出为 5。 cout << arr[0]; return 0; }
这里输出了值 5,因为第一个元素的索引为零,并且在第零个索引处我们已经分配了值 5。
使用数组的优点:
数组允许随机访问元素。这使得按位置访问元素更快。
数组具有更好的 缓存位置 ,可以在性能上产生相当大的差异。
数组使用单个名称表示相同类型的多个数据项。
使用数组的缺点:
你不能改变大小,即一旦你声明了数组,你就不能改变它的大小,因为分配给它的静态内存。这里插入和删除很困难,因为元素存储在连续的内存位置,并且移位操作也很昂贵。
现在如果以使用数组实现数据结构 Stack 为例,有一些明显的缺陷。
我们以栈的POP操作为例。算法会像这样。
1.检查堆栈下溢
2.将顶部减 1
所以我们正在做的是,指向最顶层元素的指针是递减的,这意味着我们实际上只是限制了我们的视图,如果您有任何原始数据类型,则元素停留在那里谈论内存空间,那么它可能没问题,但是数组会占用大量内存。
例子
// C/C++/Java 中的字符数组 char arr1[] = {‘g’, ‘e’, ‘e’, ‘k’, ‘s’};
// C/C++/Java 中的整数数组 int arr2[] = {10, 20, 30, 40, 50};
// 通常访问数组中第 i 个索引处的项目 // 作为“arr[i]”。例如 arr1[0] 给我们 ‘g’ // arr2[3] 给了我们
40。
通常,字符数组称为“string”,而整数或浮点数数组则简称为数组。
数组上的应用
1.数组存储相同数据类型的数据元素。
2.数组可用于 CPU 调度。
3.用于实现其他数据结构,如堆栈、队列、堆、哈希表等。