我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第19篇文章,点击查看活动详情
- 它是由单个元素引用的一组相似数据类型的变量。
- 它的元素存储在一个连续的内存位置。
- 声明数组时应提及数组的大小。
- 数组元素始终从零 (0) 开始计数。
- 可以使用数组中元素的位置来访问数组元素。
- 该数组可以具有一维或多维。
C/C++ 或任何编程语言中的数组是存储在连续内存位置的类似数据项的集合,并且可以使用数组的索引随机访问元素。它们可用于存储原始数据类型的集合,例如任何特定类型的 int、float、double、char 等。此外,C/C++ 中的数组可以存储派生数据类型,例如结构、指针等。下面给出的是数组的图片表示。
为什么我们需要数组?
当我们有少量对象时,我们可以使用普通变量(v1,v2,v3,..),但如果我们要存储大量实例,使用普通变量管理它们变得困难。数组的想法是在一个变量中表示许多实例。
优点:-
- 代码优化:我们可以有效地检索或排序数据。
- 随机访问:我们可以获取位于索引位置的任何数据。
缺点:-
- 大小限制:我们只能在数组中存储固定大小
- 的元素。它在运行时不会增长它的大小。
C/C++ 中的数组声明:
注意: 在上图中 int a[3]={[0…1]=3}; 这种声明自 GCC 2.5 以来已经过时
我们可以通过多种方式声明数组。它可以通过指定它的类型和大小、初始化它或两者兼而有之来完成。
通过指定大小声明数组
#include <iostream>
using namespace std;
int main()
{
// 通过指定大小声明数组
int arr1[10];
// 使用最近的 C/C++ 版本,我们还可以声明一个用户指定大小的数组
int n = 10;
int arr2[n];
return 0;
}
#include <stdio.h>
int main(void)
{
// 通过指定大小声明数组
int arr1[10];
// 使用最近的 C/C++ 版本,我们还可以声明一个用户指定大小的数组
int n = 10;
int arr2[n];
return (0);
}
通过初始化元素声明数组
// 通过初始化元素声明数组
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 10, 20, 30, 40};
return 0;
// 编译器创建一个大小为 4 的数组。上面与 "int arr[4] = {10, 20, 30, 40}" 相同
}
// 通过初始化元素声明数组
#include <stdio.h>
int main(void)
{
int arr[] = { 10, 20, 30, 40};
// 编译器创建一个大小为 4 的数组。上面与 "int arr[4] = {10, 20, 30, 40}" 相同
return (0);
}
通过指定大小和初始化元素来声明数组
#include <iostream>
using namespace std;
int main()
{
// 通过指定大小和初始化元素来声明数组
int arr[6] = { 10, 20, 30, 40 };
// 编译器创建一个大小为 6 的数组,初始化用户指定的前 4 个元素,其余两个元素为 0。上面与 "int arr[] = {10, 20, 30, 40, 0, 0}" 相同
return 0;
}
#include <stdio.h>
int main(void)
{
// 通过指定大小和初始化元素来声明数组
int arr[6] = { 10, 20, 30, 40 };
// 编译器创建一个大小为 6 的数组,初始化用户指定的前 4 个元素,其余两个元素为 0。上面与 "int arr[] = {10, 20, 30, 40, 0, 0}" 相同
return (0);
}
C/C++ 中数组的优点:
- 使用数组索引随机访问元素。
- 使用更少的代码行,因为它创建了多个元素的单个数组。
- 轻松访问所有元素。
- 使用单个循环遍历数组变得很容易。
- 排序变得容易,因为它可以通过编写更少的代码行来完成。
C/C++ 中数组的缺点:
- 允许输入在声明时确定的固定数量的元素。与链表不同,C 中的数组不是动态的。
- 元素的插入和删除可能代价高昂,因为需要根据新的内存分配来管理元素。
关于 C/C++ 中的数组的事实:
- 访问数组元素:
使用整数索引访问数组元素。数组索引从 0 开始,一直到数组大小减 1。 - 数组的名称也是指向数组第一个元素的指针。
例子:
#include <stdio.h>
int main()
{
int arr[5];
arr[0] = 5;
arr[2] = -10;
arr[3 / 2] = 2; // this is same as arr[1] = 2
arr[3] = arr[0];
printf("%d %d %d %d", arr[0],
arr[1], arr[2], arr[3]);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int arr[5];
arr[0] = 5;
arr[2] = -10;
// 这与 arr[1] = 2 相同
arr[3 / 2] = 2;
arr[3] = arr[0];
cout << arr[0] << " " << arr[1] << " " << arr[2] << " "
<< arr[3];
return 0;
}
输出
5 2 -10 5
无索引
越界检查:C/C++ 中没有索引越界检查,例如,以下程序编译良好,但运行时可能会产生意外输出。
这个 C++ 程序编译得很好,因为 C 中没有检查越界的索引。
#include <iostream>
using namespace std;
int main()
{
int arr[2];
cout << arr[3] << " ";
cout << arr[-2] << " ";
return 0;
}
这个 C 程序编译得很好,因为 C 中没有检查越界的索引。
#include <stdio.h>
int main()
{
int arr[2];
printf("%d ", arr[3]);
printf("%d ", arr[-2]);
return 0;
}
输出
211343841 4195777
在 C 中,初始化具有比指定大小更多的元素的数组不是编译器错误。例如,下面的程序编译得很好并且只显示了一个警告。
#include <stdio.h>
int main()
{
// 通过使用比指定大小更多的元素对其进行初始化来声明数组。
int arr[2] = { 10, 20, 30, 40, 50 };
return 0;
}
警告:
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]'” 。
如果大家在阅读我的文章的时候发现了一些错误,欢迎在评论区留言告诉我。我是一个正在学习C++的蒟蒻,关注我,我们一起加油。