Ответ 1
Я понимаю, что оператор == просто сравнивает адреса первых двух элементов
Это правильно: если вы сравниваете два массива с помощью ==
, он будет сравнивать адреса массивов, поэтому он будет давать только true
, если вы сравниваете массив с самим собой (или с указателем на элемент один и тот же тип). Ниже приведено описание ниже.
the = operator, когда используется как array1 = array2; просто заставит массив1 указывать на ту же ячейку памяти, что и массив2.
Это неверно, потому что массив не является указателем. 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;
}
Для "присваиваемого" массива вы можете использовать контейнер-подобный класс array
, найденный в Boost (boost::array
), С++ TR1 (std::tr1::array
) или С++ 0x (std::array
). Это фактически класс, содержащий массив; он может быть скопирован и обеспечивает многие преимущества контейнеров стандартной библиотеки, а также характеристики производительности массива и возможность использовать его данные в качестве массива, когда вам нужно.