theme: channing-cyan highlight: a11y-dark
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
C/C 或任何编程语言中的数组是存储在连续内存位置的相似数据项的集合,可以使用数组的索引随机访问元素。它们可用于存储原始数据类型的集合,例如任何特定类型的 int、float、double、char 等。此外,C/C 中的数组可以存储派生的数据类型,例如结构、指针等。
为什么我们需要数组? 当我们有少量对象时,我们可以使用普通变量(v1, v2, v3, ..),但是如果我们要存储大量实例,用普通变量来管理它们就变得困难了。数组的想法是在一个变量中表示许多实例。
通过指定大小声明数组
代码语言:javascript复制// 通过指定大小声明数组
int arr1[10];
// 使用最近的 C/C 版本,我们还可以声明一个用户指定大小的数组
int n = 10;
int arr2[n];
通过初始化元素声明数组
代码语言:javascript复制// 通过初始化元素声明数组
int arr[] = { 10, 20, 30, 40 }
// 编译器创建一个大小为 4 的数组。上面与“int arr[4] = {10, 20, 30, 40}”相同
通过指定大小和初始化元素来声明数组
代码语言:javascript复制// 通过指定大小和初始化元素来声明数组
int arr[6] = { 10, 20, 30, 40 }
// 编译器创建一个大小为 6 的数组,初始化用户指定的前 4 个元素,其余两个元素为 0。上面与“int arr[] = {10, 20, 30, 40, 0, 0}”相同
C/C 中数组的优点:
- 使用数组索引随机访问元素。
- 使用更少的代码行,因为它创建了一个包含多个元素的数组。
- 轻松访问所有元素。
- 使用单个循环遍历数组变得容易。
- 排序变得容易,因为它可以通过编写更少的代码行来完成。
C/C 中数组的缺点:
- 允许输入在声明时决定的固定数量的元素。与链表不同,C 中的数组不是动态的。
- 由于需要根据新的内存分配来管理元素,因此插入和删除元素的成本可能很高。
关于 C/C 数组的事实:
- 访问数组元素: 使用整数索引访问数组元素。数组索引从 0 开始,一直到数组大小减 1。
- 数组的名称也是指向数组第一个元素的指针。
例子:
代码语言:javascript复制#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;
}
**输出**
```c
5 2 -10 5
无索引 越界检查:C/C 中没有索引越界检查,例如,以下程序编译良好,但运行时可能会产生意外输出。
代码语言:javascript复制// 这个 C 程序编译得很好,因为在 C 中没有检查越界索引。
#include <iostream>
using namespace std;
int main()
{
int arr[2];
cout << arr[3] << " ";
cout << arr[-2] << " ";
return 0;
}
输出
代码语言:javascript复制-449684907 4195777
在 C 中,用多于指定大小的元素初始化数组不是编译器错误。例如,下面的程序编译良好,只显示警告。
代码语言:javascript复制#include <stdio.h>
int main()
{
// 通过使用比指定大小更多的元素对其进行初始化来声明数组。
int arr[2] = { 10, 20, 30, 40, 50 };
return 0;
}
警告:
代码语言:javascript复制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 initixxalizer
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]'” 。
元素存储在连续的内存位置 示例:
代码语言:javascript复制// C program to demonstrate that array elements
// are stored contiguous locations
#include <iostream>
using namespace std;
int main()
{
int arr[5], i;
cout << "Size of integer in this compiler is "
<< sizeof(int) << "n";
for (i = 0; i < 5; i )
cout << "Address arr[" << i << "] is " << &arr[i]
<< "n";
return 0;
}
输出
代码语言:javascript复制Size of integer in this compiler is 4
Address arr[0] is 0x7ffe75c32210
Address arr[1] is 0x7ffe75c32214
Address arr[2] is 0x7ffe75c32218
Address arr[3] is 0x7ffe75c3221c
Address arr[4] is 0x7ffe75c32220
Another way to traverse the array
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
int main()
{
int arr[6]={11,12,13,14,15,16};
// Way -1
for(int i=0;i<6;i )
cout<<arr[i]<<" ";
cout<<endl;
// Way 2
cout<<"By Other Method:"<<endl;
for(int i=0;i<6;i )
cout<<i[arr]<<" ";
cout<<endl;
return 0;
}
输出
代码语言:javascript复制11 12 13 14 15 16
By Other Method:
11 12 13 14 15 16
数组 vs 指针 数组和指针是两个不同的东西(我们可以通过应用 sizeof 来检查)。发生混淆是因为数组名称表示第一个元素的地址,数组总是作为指针传递(即使我们使用方括号)。 C 中的向量是什么? C 中的向量是 STL 中表示数组的类。向量相对于普通数组的优点是,
- 当我们声明一个向量时,我们不需要传递大小作为额外的参数,即向量支持动态大小(我们不必最初指定向量的大小)。我们还可以调整向量的大小。
- 向量有许多内置功能,例如删除元素等。