C++数组怎么定义 C++一维与二维数组初始化方法【代码】

1次阅读

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

C++数组怎么定义 C++一维与二维数组初始化方法【代码】

怎么声明固定大小的 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::arraystd::vector

text=ZqhQzanResources