Форум программистов, компьютерный форум CyberForum.ru

Копирование одного массива в другой - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.71
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.07.2012, 13:49     Копирование одного массива в другой #1
Всем добрый день. Насколько мне известно использование имени массива без индекса образует указатель на первый элемент массива. В программе я кладу в 1 указатель адрес, который лежит в другом указателе. Но получается ошибка. Почему?

C++
1
2
3
4
  int first[10] = {0,1,2,3,4,5,6,7,8,9};
  int second[10];
 
 second = first // ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 13:53     Копирование одного массива в другой #2
Да вроде все верно...
Какая ошибка? Чего пишет?
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.07.2012, 13:57  [ТС]     Копирование одного массива в другой #3
выражение должно быть допустимым для изменения левосторонним значением

Добавлено через 1 минуту
Суть в том, что как я понял массивы нельзя копировать друг в друга с помощью операции присваивания. Нужно использовать поэлементное копирование. Почему так?
ProNoooob
71 / 71 / 6
Регистрация: 14.10.2009
Сообщений: 121
28.07.2012, 14:01     Копирование одного массива в другой #4
second это массив, а не указатель.
Нельзя ему присвоить никакое другое значение.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.07.2012, 14:04  [ТС]     Копирование одного массива в другой #5
second это указатель на первый элемент массива
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 14:05     Копирование одного массива в другой #6
Думаю, такое вот выражение должно сработать.
C++
1
2
3
  int first[10] = {0,1,2,3,4,5,6,7,8,9};
  int *second;
  second = first;
Цитата Сообщение от bgm313 Посмотреть сообщение
Почему так?
Честно говоря, нечто внятное я сказать по этому поводу не смогу.
Возможно, так написано в стандарте =)
А возможно, это потому что массив не является явным указателем и в случае успеха получится, что на один участок памяти ссылается 2 массива, что не есть хорошо. Другое дело с указателем... Мне кажется так.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
28.07.2012, 14:06     Копирование одного массива в другой #7
Потому что имя массива - это почти то же, что константный указатель. То есть, ему нельзя будет присвоить другой адрес.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 14:08     Копирование одного массива в другой #8
И вообще, под массивом подразумевается некий константный участок памяти, который имеет фиксированный размер. 2 массива имеют 2 разных участка памяти. При попытке "копирования", вы пытаетесь совместить эти два участка. Это неверно.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.07.2012, 14:11  [ТС]     Копирование одного массива в другой #9
Цитата Сообщение от Schizorb Посмотреть сообщение
Потому что имя массива - это почти то же, что константный указатель. То есть, ему нельзя будет присвоить другой адрес.
Да, но second никуда не указывает, ему присваивается значение в 1 раз.

Добавлено через 56 секунд
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
И вообще, под массивом подразумевается некий константный участок памяти, который имеет фиксированный размер. 2 массива имеют 2 разных участка памяти. При попытке "копирования", вы пытаетесь совместить эти два участка. Это неверно.
Возможно так оно и есть
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 14:11     Копирование одного массива в другой #10
Цитата Сообщение от bgm313 Посмотреть сообщение
second никуда не указывает
Неверно. Память уже выделена, значит он куда то, да указывает.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.07.2012, 14:13  [ТС]     Копирование одного массива в другой #11
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Неверно. Память уже выделена, значит он куда то, да указывает.
Мне кажется, что под него просто резервируется место и всё. Но он никуда не указывает.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 14:15     Копирование одного массива в другой #12
Цитата Сообщение от bgm313 Посмотреть сообщение
Мне кажется, что под него просто резервируется место и всё. Но он никуда не указывает.
Ну да, место резервируется, и вы на него можете нечто положить.
Следующее, ведь, верно =)
C++
1
2
int a[10];
a[2] = 1;
Память выделена (зарезервирована, если хотите) и мы можем с массивом свободно работать.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
28.07.2012, 14:15     Копирование одного массива в другой #13
Цитата Сообщение от bgm313 Посмотреть сообщение
Мне кажется, что под него просто резервируется место и всё.
Ну, это место же где то располагается в памяти. Вот туда и указывает. А инициализирован массив при объявлении или нет, это дело десятое...

Вот аналогичный пример с указателями.

C++
1
2
3
4
5
int * const first = new int[10];
for(int i = 0; i < 10; ++i)
        first[i] = i;
 
int * const second = new int[10];
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
28.07.2012, 14:17     Копирование одного массива в другой #14
Цитата Сообщение от bgm313 Посмотреть сообщение
Мне кажется, что под него просто резервируется место и всё. Но он никуда не указывает.
А вы проверьте.
C++
1
2
3
4
5
    int first[10] = {0,1,2,3,4,5,6,7,8,9};
    int second[10];
 
    cout << &first << endl;     // Здесь один адрес
    cout << &second << endl;   // А здесь совсем другой
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
28.07.2012, 14:22     Копирование одного массива в другой #15
Имя массива является константным указателем на его первый элемент. Если нужно присвоить значения из первого массива второму, используйте цикл:
C++
1
2
for ( int i = 0; i < 10; i++ )
   second[ i ] = first[ i ];
или функцию memcpy из cstdlib:
C++
1
std::memcpy( second, first, sizeof( int ) * 10 );
Добавлено через 4 минуты
Даже если бы Вы использовали не константные указатели, то при присваивании, Вы бы не скопировали значения, а всего лишь навсего указатель second указывал бы туда же, куда и first.
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
30.07.2012, 00:02     Копирование одного массива в другой #16
Я такие штуки с векторами делаю))) Так проще.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
30.07.2012, 00:23     Копирование одного массива в другой #17
C++
1
2
3
4
5
6
7
8
9
10
11
int second[10];
int first[10];
int *ptr = &second[0];
for (int i = 0;i < 10;i++)
first[i] = *ptr;
 
//ili
int second[10];
int first[10];
for (int i = 0; i < 10 ; ++i)
second[i] = first[i];
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 00:46     Копирование одного массива в другой #18
ты также не можешь переприсвоить значение объявленной ссылке. считай, что имя объявленного массива - это не просто "указатель на первый элемент массива", а ссылка на этот указатель. и смирись.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
30.07.2012, 06:26     Копирование одного массива в другой #19
Цитата Сообщение от xADMIRALx Посмотреть сообщение
for (int i = 0;i < 10;i++)
first[i] = *ptr;
Как думаете, правильно скопируется?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 07:54     Копирование одного массива в другой
Еще ссылки по теме:

копирование с одного массива в другой C++
Копирование слов из одного файла в другой C++
Копирование элементов из одного массива в другой C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
30.07.2012, 07:54     Копирование одного массива в другой #20
засмотрелся )
C++
1
first[i] = *(ptr++);
Yandex
Объявления
30.07.2012, 07:54     Копирование одного массива в другой
Ответ Создать тему
Опции темы

Текущее время: 16:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru