在 C++ 中,数组是一种内置的数据结构,用于存储固定大小的同类型元素,这些元素在内存中连续排列。这种存储特性使得数组具有以下关键特点:
数据类型 数组名[元素个数];
int scores[5]; // 声明一个包含5个整数的数组,元素默认值未初始化(值为随机数)
double prices[3] = {10.5, 20.0, 30.8}; // 初始化数组
char vowels[] = {'a', 'e', 'i', 'o', 'u'}; // 省略大小,编译器自动计算(元素个数为5)
int nums[10] = {0}; // 所有元素初始化为0
假设定义 int arr[3] = {1, 2, 3};
,其在内存中的存储如下:
内存地址(假设从 0x7fff 开始) | 存储值 |
---|---|
0x7fff | 1 |
0x7fff + 4(int 占 4 字节) | 2 |
0x7fff + 8 | 3 |
&arr[0]
)。arr[i]
等价于 *(arr + i)
。int arr[5] = {1, 3, 5, 7, 9};
for (int i = 0; i < 5; i++) {
cout << arr[i] << " "; // 输出:1 3 5 7 9
}
for (int num : arr) {
cout << num << " "; // 输出同上
}
int *ptr = arr;
for (int i = 0; i < 5; i++) {
cout << *(ptr + i) << " "; // 输出同上
}
void func(int arr[10]) { // 等价于 void func(int* arr)
cout << sizeof(arr) << endl; // 输出4/8(指针大小),而非10*4=40
}
sizeof
获得原始数组大小。数据类型 数组名[行数][列数];
int matrix[2][3] = {
{1, 2, 3}, // 第0行
{4, 5, 6} // 第1行
};
二维数组在内存中按行优先顺序连续存储,等价于一维数组的嵌套。例如 matrix
的存储顺序为:1→2→3→4→5→6
。
matrix
是指向一维数组(含 3 个 int)的指针,类型为 int (*)[3]
。matrix[i][j]
等价于 *(*(matrix + i) + j)
。\0
结尾的字符数组)。下标越界:访问超过数组长度的索引(如 arr[5]
对长度为 5 的数组),会导致未定义行为。
sizeof(arr)/sizeof(arr[0])
获取数组长度(仅适用于原始数组,非指针)。数组传参退化问题:
void printArray(int arr[], int size) { // 显式传递size参数
for (int i = 0; i < size; i++) { ... }
}
int main() {
int arr[3] = {1,2,3};
printArray(arr, sizeof(arr)/sizeof(int)); // 传递正确长度
}
与 vector 的对比:
std::vector
:动态扩容,安全性高,推荐优先使用(需包含头文件
)。需求:输入 10 个学生成绩,统计及格率(≥60 分)。
#include
using namespace std;
int main() {
int scores[10];
int passCount = 0;
// 输入成绩
cout << "请输入10个学生成绩:" << endl;
for (int i = 0; i < 10; i++) {
cin >> scores[i];
if (scores[i] >= 60) passCount++;
}
// 计算及格率
double passRate = static_cast(passCount) / 10 * 100;
cout << "及格率:" << passRate << "%" << endl;
return 0;
}
std::vector
或 std::array
(C++11 提供,封装了数组,支持迭代器和大小查询)。通过本文,你已掌握 C++ 数组的核心概念、操作技巧及实战应用。在实际开发中,需根据场景选择合适的数据结构,兼顾性能与安全性。