簡體   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