平等与在C ++中用于数组的赋值运算符

时间:2011-03-17 21:49:39

标签: c++ arrays operators

我收到了一个令我困惑的作业问题。问题是:

  

在C ++中,等式测试==可能是   适用于数组,但是赋值   operator =无法应用于   阵列。解释原因。

这让我感到困惑,因为我的理解是==运算符只会比较前两个元素的地址(如果两个数组实际上保存在不同的内存位置,当然会有所不同)。 =运算符与array1 = array2;一样使用时,只会导致array1指向与array2相同的内存位置。

我在这里缺少什么?似乎可以使用任何一个运算符,但两者都不会产生通常由这些运算符预期的结果。

1 个答案:

答案 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)。它实际上是一个包含数组的类;它可以被复制,它提供了标准库容器的许多好处,加上数组的性能特征,以及在需要时将其数据用作数组的能力。