问题描述
所以在图片中,它说问题在于数组的起始地址,因为我们无法更改它。但为什么这仅适用于数组。 int x = 1;
我们可以轻松地说 int y = x;
并且它会起作用。这不会改变变量的内存地址吗?
解决方法
[tl;dr] newValues = oldValues;
是非法的(“不起作用”)的第一个也是唯一的原因是 C++ 标准禁止它。 C++ 中未定义、支持或允许数组赋值,因此任何此类语句都是无效代码。使用内存地址或其他推测来“解释”它的任何其他尝试只会混淆一个简单的事实,即语言的定义决定了语言中什么是合法的,什么是不合法的。
以下内容引用自已发布的“教科书”摘录,我发现它既错误又被误导,因为它看起来像是对 C++ 基础知识的介绍。
不带括号和下标的数组名代表数组的起始内存地址
错了。该名称代表它所表示的变量,它具有 array
类型。虽然在某些上下文中数组可以衰减为指针(“起始内存地址),但数组名称与它的相同肯定是不正确的。起始地址。例如,sizeof oldValues
和 typeid(oldValues)
都是有效的表达式,如果将 oldValues
替换为其内存地址,则含义将大不相同。
该语句将不起作用,因为您无法更改数组的起始内存地址
“不会工作”的说法是正确的,但给出的原因仍然是错误的。没有赋值改变它左边的地址,它只改变它的值。数组赋值不起作用,因为语言没有定义它,没有其他原因。例如,考虑以下内容。
int a[4],b[4];
a = b; // error,array assignment not allowed
struct { int n[4]; } c,d;
c = d; // ok,using default copy assignment