数组是数据结构中最基本的数据类型之一,它是一组具有相同数据类型的数据元素的集合,每个元素可以通过一个索引(Index)来访问。在C++中,数组是一种固定大小的数据结构,可以使用数组名和索引来访问数组元素。下面我们来详细讲解数组在数据结构中涉及的所有知识点。
声明和初始化数组
声明数组需要指定数组的数据类型和数组的大小,语法格式如下:
dataType arrayName[arraySize];
其中,dataType
表示数组元素的数据类型,arrayName
表示数组名,arraySize
表示数组的大小,即数组中元素的数量。例如,下面的代码声明了一个包含10个整数的数组:
int arr[10];
数组初始化是指在声明数组的同时为数组元素赋初值。C++中有以下几种方式来初始化数组:
- 指定所有元素的初值:可以使用花括号({})来指定数组的初值,其中的元素用逗号隔开。例如,下面的代码初始化了一个包含5个整数的数组:
int arr[5] = {1, 2, 3, 4, 5};
- 部分初始化:只指定部分元素的初值,未指定元素的初值将被自动初始化为0或空字符(对于字符数组)。例如,下面的代码初始化了一个包含5个整数的数组,其中前3个元素的初值为1、2、3,后2个元素的初值为0:
int arr[5] = {1, 2, 3};
- 不指定任何初值:数组元素将被自动初始化为0或空字符(对于字符数组)。例如,下面的代码声明了一个包含10个整数的数组,其中所有元素的初值都为0:
int arr[10] = {};
访问数组元素
数组元素可以通过数组名和索引来访问。数组的索引从0开始,到数组大小减1结束。例如,下面的代码访问了数组arr
中的第3个元素:
int arr[5] = {1, 2, 3, 4, 5};
int x = arr[2]; // x的值为3
- 数组的遍历
数组的遍历是指按顺序访问数组中的所有元素。可以使用循环语句来遍历数组,例如,下面的代码使用for循环遍历数组arr
:
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
输出结果为:
1 2 3 4 5
数组的长度
在C++中,数组的长度是固定的,不能动态改变。可以使用sizeof运算符来获得数组的长度,例如,下面的代码计算了数组arr
的长度:
int arr[5] = {1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]); // len的值为5
其中,sizeof(arr)
返回数组arr
的总字节数,sizeof(arr[0])
返回数组元素arr[0]
的字节数,两者相除即可得到数组的长度。
多维数组
多维数组是指数组中的每个元素也是一个数组的数组。例如,下面的代码声明了一个二维数组:
int arr[3][4];
其中,arr
是一个包含3个元素的一维数组,每个元素又是一个包含4个元素的一维数组。可以使用两个索引来访问二维数组中的元素,例如,下
数组作为函数参数
数组可以作为函数的参数传递,可以按传值或传引用的方式传递。在函数中声明数组参数时,可以省略数组大小,例如,下面的代码定义了一个函数,它的参数是一个整数数组:
void printArray(int arr[], int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
在调用函数时,可以将数组名作为参数传递给函数,例如,下面的代码调用了上面定义的printArray
函数:
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5);
输出结果为:
1 2 3 4 5
动态数组
动态数组是指可以动态改变大小的数组。在C++中,可以使用new运算符动态创建数组,例如,下面的代码创建了一个包含10个整数的动态数组:
int* arr = new int[10];
在使用完动态数组后,需要使用delete
运算符释放数组的内存空间,例如,下面的代码释放了上面动态创建的数组的内存空间:
delete[] arr;//delete后要加[]告诉要删除的是数组空间
vector容器
vector是C++标准库中提供的动态数组容器,可以动态改变大小,支持快速的随机访问和插入/删除操作。在使用vector之前,需要包含头文件<vector>
,例如,下面的代码定义了一个包含5个整数的vector:
#include <vector>
using namespace std;
vector<int> vec(5);
其中,vec
是一个包含5个元素的vector,每个元素的初值为0。可以使用下标访问vector中的元素,例如,下面的代码访问了vectorvec
中的第3个元素:
int x = vec[2]; // x的值为0
vector还提供了很多有用的成员函数,例如:
push_back
:在vector的末尾添加一个元素;pop_back
:删除vector的末尾元素;size
:返回vector中元素的数量;empty
:判断vector是否为空;clear
:清空vector中所有元素。
例如,下面的代码演示了如何使用vector:
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.pop_back();
cout << vec.size() << endl; // 输出2
vec.clear();
cout << vec.empty() << endl; // 输出1
输出结果为:
2
1
多维数组
除了一维数组,C++还支持多维数组。多维数组是指包含多个维度的数组,例如,二维数组和三维数组等。在C++中,可以使用嵌套的一维数组来实现多维数组,例如,下面的代码定义了一个包含3行4列的二维数组:
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
在访问多维数组的元素时,可以使用多个下标,例如,下面的代码访问了上面定义的二维数组中的第2行第3列的元素:
int x = arr[1][2]; // x的值为7
类似地,可以定义更高维度的数组,例如,下面的代码定义了一个包含2页3行4列的三维数组:
int arr[2][3][4] = {
{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
{{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
};
在访问三维数组的元素时,需要使用三个下标,例如,下面的代码访问了上面定义的三维数组中的第2页第3行第4列的元素:
int x = arr[1][2][3]; // x的值为24
数组和指针的关系
在C++中,数组和指针有着密切的关系。数组名在很多情况下可以看作指向数组首元素的指针,例如,下面的代码演示了如何使用数组名来访问数组中的元素:
int arr[5] = {1, 2, 3, 4, 5};
int x = *(arr + 2); // x的值为3
其中,arr
可以看作指向数组首元素的指针,arr + 2
实际上是指向数组中的第3个元素,*(arr + 2)
则是取出该元素的值。
此外,可以将数组名作为函数的参数传递给函数,例如,下面的代码定义了一个函数,它的参数是一个整型指针:
void printArray(int* arr, int len) {
for (int i = 0; i < len; i++) {
cout << *(arr + i) << " ";
}
cout << endl;
}
在调用函数时,可以将数组名作为参数传递给函数,例如,下面的代码调用了上面定义的printArray
函数:
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5);
输出结果为:
1 2 3 4 5
需要注意的是,在函数中使用数组名作为参数传递时,虽然数组名可以看作指向数组首元素的指针,但是数组的大小信息也需要一同传递,以便函数正确地访问数组中的元素。