一、提要
只学习一个C语言可能“没用”,但是如果你是搞AI的,或是深度学习、或是自动驾驶、或是机器人,达到一定程度,都能发现C++的不足。因此,凡是搞人工智能的,业余时间磨一磨C++是有益的。
本文是BOOST库的C或C++的系列文章,本文针对其中的数组元素Array对象进行讨论。
二、数组 (Array)
- 它是由单个元素引用的一组相似数据类型的变量。
- 它的元素存储在一个连续的内存位置。
- 声明数组时应提及数组的大小。
- 数组元素始终从零 (0) 开始计数。
- 可以使用数组中元素的位置来访问数组元素。
- 该数组可以具有一维或多维。
C/C++ 或任何编程语言中的数组是存储在连续内存位置的类似数据项的集合,并且可以使用数组的索引随机访问元素。它们可用于存储原始数据类型的集合,例如任何特定类型的 int、float、double、char 等。此外,C/C++ 中的数组可以存储派生数据类型,例如结构、指针等。下面给出的是数组的图片表示。
2.1 为什么我们需要数组?
当我们有少量对象时,我们可以使用普通变量(v1,v2,v3,..),但如果我们要存储大量实例,使用普通变量管理它们变得困难。数组的想法是在一个变量中表示许多实例。
优点:-
代码优化:我们可以有效地检索或排序数据。
随机访问:我们可以获取位于索引位置的任何数据。
缺点:-
大小限制:我们只能在数组中存储固定大小的元素。它在运行时不会增长它的大小。
2.2 C/C++ 中的数组声明:
注意:在上图中 int a[3]={[0…1]=3};这种声明自 GCC 2.5 以来已经过时
我们可以通过多种方式声明数组。它可以通过指定它的类型和大小、初始化它或两者兼而有之来完成。
1)通过指定大小声明数组
#include <iostream>
using namespace std;
int main()
{
// array declaration by specifying size
int arr1[10];
// With recent C/C++ versions, we can also
// declare an array of user specified size
int n = 10;
int arr2[n];
return 0;
}
// This code is contributed by sarajadhav12052009
2)数组声明通过初始化元素
|
3)通过指定大小和初始化元素来声明数组
|
2.3 C/C++ 中数组的优点:
允许输入在声明时确定的固定数量的元素。与链表不同,C 中的数组不是动态的。
元素的插入和删除可能代价高昂,因为需要根据新的内存分配来管理元素。
关于 C/C++ 中的数组的事实:
- 访问数组元素:
使用整数索引访问数组元素。数组索引从 0 开始,一直到数组大小减 1。
2. 数组的名称也是指向数组第一个元素的指针。
Example:
|
Output
5 2 -10 5
2.4 无索引越界检查
在 C/C++ 中没有索引越界检查,例如,以下程序编译良好,但运行时可能会产生意外输出。
|
Output
211343841 4195777
在 C 中,初始化具有比指定大小更多的元素的数组不是编译器错误。例如,下面的程序编译得很好并且只显示了一个警告。
|
Warnings:
prog.c: In function 'main': prog.c:7:25: warning: excess elements in array initializer int arr[2] = { 10, 20, 30, 40, 50 }; ^ prog.c:7:25: note: (near initialization for 'arr') prog.c:7:29: warning: excess elements in array initializer int arr[2] = { 10, 20, 30, 40, 50 }; ^ prog.c:7:29: note: (near initialization for 'arr') prog.c:7:33: warning: excess elements in array initializer int arr[2] = { 10, 20, 30, 40, 50 }; ^ prog.c:7:33: note: (near initialization for 'arr')
注意:该程序不会在 C++ 中编译。如果我们将上述程序保存为 .cpp,程序会生成编译器错误“error: too many initializers for ‘int [2]’”。
元素存储在连续的内存位置
例子:
|
Output
Size of integer in this compiler is 4 Address arr[0] is 0x7fff7a02db20 Address arr[1] is 0x7fff7a02db24 Address arr[2] is 0x7fff7a02db28 Address arr[3] is 0x7fff7a02db2c Address arr[4] is 0x7fff7a02db30
遍历数组的另一种方法
|
Output
11 12 13 14 15 16 By Other Method: 11 12 13 14 15 16
- 数组与指针
数组和指针是两个不同的东西(我们可以通过应用 sizeof 来检查)。之所以会发生混淆,是因为数组名称表示第一个元素的地址,并且数组总是作为指针传递(即使我们使用方括号)。请参阅 C 中指针和数组之间的区别?更多细节。
- C++中的向量是什么?
C++ 中的向量是 STL 中表示数组的类。向量相对于普通数组的优点是,
当我们声明一个向量时,我们不需要传递大小作为额外参数,即向量支持动态大小(我们最初不必指定向量的大小)。我们还可以调整向量的大小。
向量具有许多内置功能,例如删除元素等。
要详细了解向量提供的功能,请参阅 C++ 中的向量了解更多详细信息。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。