我收到了一个令我困惑的作业问题。问题是:
在C ++中,等式测试==可能是 适用于数组,但是赋值 operator =无法应用于 阵列。解释原因。
这让我感到困惑,因为我的理解是==
运算符只会比较前两个元素的地址(如果两个数组实际上保存在不同的内存位置,当然会有所不同)。 =
运算符与array1 = array2;
一样使用时,只会导致array1指向与array2相同的内存位置。
我在这里缺少什么?似乎可以使用任何一个运算符,但两者都不会产生通常由这些运算符预期的结果。
答案 0 :(得分:16)
我的理解是==运算符只会比较前两个元素的地址
这是正确的:如果使用==
比较两个数组,它将比较数组的地址,因此如果将数组与自身(或指针)进行比较,它只会产生true
到相同类型的元素)。请参阅以下说明了解原因。
=运算符,当像array1 = array2一样使用时;只会导致array1指向与array2相同的内存位置。
这是不正确的,因为数组不是指针。 array1
无法指向与array2
相同的内存位置,因为array1
不是指针,而是元素数组。
数组是一系列元素。在大多数上下文中,数组的名称被隐式转换为指向其初始元素的指针。这就是你可以做的事情:
void f(int*);
int data[10];
int* p = data; // this is the same as 'int* p = &data[0];'
f(data); // this is the same as 'f(&data[0]);'
array1 = array2;
将无法工作,因为数组不可分配(主要是出于历史原因;我从未听过一个令人信服的技术原因,为什么不允许它:C中从未允许过,C已经被几十年左右。在Why does C support memberwise assignment of arrays within structs but not generally?)的评论和答案中对此进行了一些讨论。
以下程序无法编译:
int main() {
int a[10], b[10];
a = b;
}
对于“可分配”数组,您可以使用Boost(array
),C ++ TR1(boost::array
)或C ++ 0x中找到的std::tr1::array
类似容器的类( std::array
)。它实际上是一个包含数组的类;它可以被复制,它提供了标准库容器的许多好处,加上数组的性能特征,以及在需要时将其数据用作数组的能力。