繁体   English   中英

C ++中数组上使用的等式和赋值运算符

[英]Equality & assignment operators used on arrays in C++

我得到了一个让我困惑的作业问题。 问题是:

在C ++中,等式测试==可以应用于数组,但赋值运算符=不能应用于数组。 解释为什么。

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

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

我的理解是==运算符只会比较前两个元素的地址

这是正确的:如果使用==比较两个数组,它将比较数组的地址,因此如果您将数组与自身(或指向同一类型元素的指针)进行比较,它将仅产生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已经存在了几十年。这里有一些讨论这在为什么C支持在结构中成员分配数组而不是一般情况下的注释和答案 )。

以下程序将无法编译:

int main() {
    int a[10], b[10];
    a = b;
}

对于“可赋值”数组,可以使用Boost( boost::array ),C ++ TR1( std::tr1::array )或C ++ 0x( std::array )中的类array容器类。 它实际上是一个包含数组的类; 它可以被复制,它提供了标准库容器的许多好处,加上数组的性能特征以及在需要时将其数据用作数组的能力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM