[英]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.