c++固定大小一维数组必须编译期确定长度,如int arr[5];,不支持变长数组;二维数组是“数组的数组”,内存连续,初始化需匹配维度,且数组不记录长度,推荐用std::Array或std::vector。

怎么声明固定大小的 C++ 一维数组
必须在编译期确定长度,类型和大小都得写死。比如 int arr[5]; 声明了 5 个 int 的连续内存块,未初始化时值是随机的。
-
int arr[0];非法,大小不能为 0 -
int n = 5; int arr[n];在标准 C++ 中非法(C99 允许变长数组,但 C++ 不支持) - 数组名
arr是首元素地址,&arr是整个数组的地址,二者值相同但类型不同:前者是int*,后者是int(*)[5]
一维数组的三种常见初始化方式
初始化发生在定义时,不初始化就留垃圾值;后续赋值要用循环或算法,不能整体赋值。
- 全显式初始化:
int arr[4] = {1, 2, 3, 4};—— 元素个数必须匹配或少于声明大小 - 部分初始化:
int arr[5] = {1};—— 只设第一个为 1,其余自动补 0(仅限静态存储期或带{}的局部变量) - 省略长度(仅限定义时):
int arr[] = {1, 2, 3};—— 编译器推导出长度为 3
二维数组声明与内存布局本质
C++ 没有真正“二维”概念,int arr[2][3] 实际是“数组的数组”:一个含 2 个元素的数组,每个元素又是含 3 个 int 的数组。所有 6 个元素在内存中连续排列。
- 访问
arr[i][j]等价于*(*(arr + i) + j),底层仍是线性偏移 -
arr类型是int[2][3],arr[0]类型是int[3],&arr[0]是int(*)[3] - 不能用
int**接收int arr[2][3]—— 类型不兼容,会触发编译错误
二维数组初始化必须按行展开
初始化列表必须体现“外层数组包含几个内层数组”,否则编译失败或行为未定义。
立即学习“C++免费学习笔记(深入)”;
- 完整初始化:
int arr[2][3] = {{1,2,3}, {4,5,6}};—— 外层两个大括号对应两行 - 可省略外层大括号:
int arr[2][3] = {1,2,3,4,5,6};—— 按内存顺序填满,等效于上例 - 部分初始化:
int arr[2][3] = {{1}, {4}};→ 第一行是{1,0,0},第二行是{4,0,0} -
int arr[][3] = {{1,2}, {4,5}};合法,编译器推导出行数为 2;但int arr[2][] = {...};非法 —— 列数不可省略
最容易被忽略的是:C 风格数组不记录长度,sizeof(arr)/sizeof(arr[0]) 算总元素数只对本地定义的数组有效;传入函数后退化为指针,这个技巧就失效了。真要安全操作,优先考虑 std::array 或 std::vector。