为什么不能将数组赋值给数组?

问题描述 投票:0回答:6

所以我正在尝试一些数组,但我不明白为什么这不起作用。

int numbers[5] = {1, 2, 3};
int values[5] = {0, 0, 0, 0, 0};
values = numbers; 

出现以下错误:

Error   1   error C2106: '=' : left operand must be l-value c:\users\abc\documents\visual studio 2012\projects\consoleapplication7\consoleapplication7\main.cpp 9   1   ConsoleApplication7

为什么我不能这样做?错误是什么意思?

c++ arrays assignment-operator
6个回答
37
投票

由于 C++ 与 C 的向后兼容性,数组具有各种丑陋的行为。其中之一是数组不可分配。请改用

std::array
std::vector

#include <array>
...
std::array<int,5> numbers = {1,2,3};
std::array<int,5> values = {};
values = numbers;

如果由于某种原因,您必须使用数组,那么您将必须通过循环或使用循环的函数复制元素,例如

std::copy

#include <algorithm>
...
int numbers[5] = {1, 2, 3};
int values[5] = {};
std::copy(numbers, numbers + 5, values);

顺便说一句,您可能已经注意到我初始化

values
数组的方式有所不同,只是提供了一个空的初始值设定项列表。我依赖于标准中的一条规则,该规则规定,如果您为聚合提供初始值设定项列表,无论多么部分,所有未指定的元素都会被值初始化。对于整数类型,值初始化意味着初始化为零。所以这两个完全等价:

int values[5] = {0, 0, 0, 0, 0};
int values[5] = {};

8
投票

你不能在 C++ 中给数组赋值,这很愚蠢,但这是事实。您必须将数组元素一一复制。或者您可以使用内置函数,例如

memcpy
std::copy

或者您可以放弃数组,而使用

std::vector
代替。他们可以被分配。


4
投票

数组名称是不可修改的常量左值,您无法修改它。

values = numbers; 
// ^
// is array name

读取编译器错误消息:

"error C2106: '=' : left operand must be l-value"
左值可修改可以出现在
=
的lhs处。

您可以将数组名称分配给指针,例如:

int* ptr = numbers;

注意:数组名称是常量,但您可以修改其内容,例如

value[i] = number[i]
0 <= i < 5
的有效表达式。

为什么我不能那样做?

基本上这个限制是由语言强加的,内部数组名称用作基地址,通过基地址索引,您可以访问为数组分配的连续内存的内容。因此,在 C/C++ 数组名称中,be 出现在 lhs 处,而不是左值。


0
投票

值=数字; 因为数字和值都是指针。

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

0
投票

std::array
是个好主意,但这也是可能的:

struct arr { int values[5]; };

struct arr a{{1, 2, 3}};
struct arr b{{}};

a = b;

否则,请使用

std::memcpy
std::copy


0
投票

我认为不可分配性的原因是 C 希望确保指向数组中任何元素的任何指针几乎始终保持有效。

考虑允许动态调整大小的向量:在自动调整大小后,旧指针变得无效(可怕)。

PS。根据矢量的设计理念,以下块效果很好。

vector<int> v = {1, 5, 16, 8};
vector<int> v_2 = {7, 5, 16, 8};
v_2 = v;
© www.soinside.com 2019 - 2024. All rights reserved.