1. C++数组深度解析
数组是C++中最基础也是最常用的数据结构之一。作为连续内存块的抽象,数组提供了高效的元素访问能力,但同时也存在一些需要特别注意的特性。
1.1 数组的定义与初始化
在C++中定义数组需要明确两个关键要素:元素类型和数组长度。语法格式如下:
cpp复制元素类型 数组名[常量表达式];
这里的"常量表达式"意味着数组长度必须在编译时确定,这是C++原生数组与动态容器(如vector)的核心区别之一。实际开发中常见的数组定义方式包括:
cpp复制// 基础类型数组
int scores[5]; // 包含5个int元素的未初始化数组
double temperatures[30] = {0.0}; // 全部初始化为0.0
// 复合类型数组
struct Point {
float x, y;
};
Point polygon[10]; // 结构体数组
class Student {
// 类定义...
};
Student classA[40]; // 类对象数组
注意:C++11引入了更安全的初始化方式,建议使用统一初始化语法:
cpp复制int arr[3]{1, 2, 3}; // 使用大括号初始化
1.2 数组的内存布局与访问原理
数组元素在内存中是连续存储的,这是数组高效访问的底层基础。假设定义int arr[5],其内存布局如下:
code复制arr[0] | arr[1] | arr[2] | arr[3] | arr[4]
数组名arr实际上是一个指向首元素的常量指针,因此arr[i]等价于*(arr + i)。编译器会根据元素类型自动计算偏移量,例如对于int类型(通常4字节),arr[3]的地址计算为arr + 3*4。
1.3 数组使用的注意事项
-
越界访问:C++不检查数组索引是否合法,越界访问可能导致程序崩溃或更难发现的内存错误。这是新手最常见的错误之一。
-
数组传参:数组作为函数参数时会退化为指针,丢失长度信息。推荐的做法是同时传递数组长度:
cpp复制void processArray(int* arr, siz
