当前位置: 首页 > news >正文

C++初学的常见问题 之四

在C++中,关于数组的赋值,需要明确区分初始化赋值两种情况。

你的写法 数组名称 = {val1, val2, ...} 只有在特定条件下才合法,对于大多数普通数组来说是不允许的。

下面详细解释。


1. 数组的初始化(定义时)

1.1 静态数组(内置数组)的初始化

定义数组的同时,可以使用花括号 {} 进行初始化,这是允许的:

int arr[5] = {1, 2, 3, 4, 5};          // 正确:定义并初始化
int arr[] = {1, 2, 3, 4, 5};            // 正确:自动推断大小
int arr[5] = {};                         // 正确:所有元素初始化为0

这种语法称为列表初始化,仅在变量定义时有效。

1.2 动态数组的初始化

使用 new 动态分配的数组,也可以在分配时用列表初始化(C++11起):

int* p = new int[5]{1, 2, 3, 4, 5};      // 正确:分配并初始化

2. 数组的赋值(定义之后)

2.1 静态数组不能直接赋值

一旦数组定义完成,不能直接用花括号赋值,因为数组名是一个常量指针,不能被赋值:

int arr[5];
arr = {1, 2, 3, 4, 5};   // 错误!数组名不可赋值

这是因为 arr 是数组首地址,不能改变其指向,而且 {1,2,3,4,5} 不是一个可以赋给数组的表达式。

2.2 正确赋值方式

要给已有数组赋值,必须逐个元素操作:

int arr[5];
arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5;

或者使用循环:

int values[5] = {1,2,3,4,5};
for (int i = 0; i < 5; ++i) {arr[i] = values[i];
}

也可以使用内存拷贝函数(如 memcpystd::copy):

#include <cstring>
int src[5] = {1,2,3,4,5};
memcpy(arr, src, sizeof(arr));   // 需要确保类型相同且内存不重叠

或更安全的C++方式:

#include <algorithm>
std::copy(std::begin(src), std::end(src), std::begin(arr));

3. C++11 及以后的改进:std::arraystd::vector

3.1 std::array(定长数组容器)

std::array 是封装了固定大小数组的类模板,它支持赋值操作(包括列表赋值):

#include <array>
std::array<int, 5> arr;          // 定义
arr = {1, 2, 3, 4, 5};           // 正确:可以整体赋值(使用 operator=)

这是因为 std::array 重载了赋值运算符,允许从初始化列表赋值。但注意,std::array 的大小必须在编译时固定。

3.2 std::vector(动态数组容器)

std::vector 也支持列表赋值:

#include <vector>
std::vector<int> vec;             // 定义
vec = {1, 2, 3, 4, 5};            // 正确:可以整体赋值

vector 可以根据列表自动调整大小。


4. 总结

数组类型 定义时用 ={...} 初始化 定义后用 ={...} 赋值
内置数组(如 int a[5] ✅ 允许 ❌ 不允许
动态数组(new int[5] ✅ 允许(C++11起) ❌ 不允许(分配后无法直接赋值)
std::array ✅ 允许 ✅ 允许(重载赋值)
std::vector ✅ 允许 ✅ 允许(重载赋值)

结论

  • 对于内置数组,不能使用 数组名 = { ... } 的形式赋值,只能在定义时初始化。
  • 如果需要类似的功能,可以考虑使用 std::arraystd::vector,它们支持整体赋值。
http://www.jsqmd.com/news/387717/

相关文章:

  • 2025 年终总结——解构,重构与锚点
  • Spring3整合MyBatis构建增删改查操作
  • 开启超人类推理之旅![特殊字符]✨
  • C++初学的常见问题 之三
  • 2月16号
  • 神经网络驱动的商业智能:需求与价格预测全流程解析
  • AI销冠系统是什么?数字员工在企业创新与效率提升中的价值何在?
  • ios 快捷指令 github跳转deepwiki
  • openclaw怎么调用记忆的
  • 前端营销I(From AIGC)
  • 10kV线路微机继电保护装置源代码,配套pcb图纸和bom。 适合自己学习的素材,也可作为基础...
  • ctfshowweb361--一道题从0入门SSTI模板注入
  • 深入解析:【Linux】零基础学习命名管道-共享内存
  • 华黎卡的排列构造
  • 2026年海外GEO系统优化推广服务商Top 5揭晓:谁在真正驱动中国品牌出海? - 深圳昊客网络
  • AI元人文:界面东西——在诗性与逻各斯间
  • 我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图 - 指南
  • JVM学习笔记:第三章——运行时数据区(部分)
  • 自助建站系统哪个好?自助建站软件选哪个好 - 码云数智
  • vue3微信小程序Nodejs无人机监控管理平台设计与实现
  • 小程序快速开发平台有哪些?小程序第三方开发平台推荐 - 码云数智
  • 基于SpringBoot和Vue的校园在线拍卖高效的系统设计与搭建
  • nodejs+Vue3+AI算力资源网上商城系统的设计与实现
  • 从Cyberhub到Aram Nagar:一个理性与创意兼具之人的内心漫游
  • 如何创建自己的微信小程序呢? - 码云数智
  • 零基础如何快速制作自己的公司网站呢? - 码云数智
  • 会员卡充值消费系统怎么做 - 码云数智
  • 小程序开发需要多少钱?小程序开发方式及费用 - 码云数智
  • 如何开发在线培训课程平台,知识付费小程序怎么做 - 码云数智
  • 会员管理系统软件哪个好?主流软件核心优势与适用场景 - 码云数智