Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как приравнять массивы друг другу? Не используя звёздочки.

kh fjkg Знаток (323), закрыт 3 года назад
Например переменные друг другу можно приравнять так: int a=b;
С массивами так же не получается. int arr[10]; int massiv[10]; arr=massiv; Так не получается.

Нужно не сохранить адрес массива в указателе,
Вот так:
int arr[]={1,2,3,4,5,6};
int *ukazatel = arr;
Это не надо.
Нужно если возможно обойтись без указателей (звёздочек).

Я спрашиваю, потому что у меня нечто подобное получилось, только я не понял как.
Получилось передать в функцию массив и загрузить этот массив в пустой массив функции.
Так:
void func(int massiv[]/*Загружаю в указатель в пустой массив. */ ){ }
int main() {
int arr[]={1,2,3,4,5};;
func(arr); // Передаю arr указатель на массив в функцию.
return 0;
}
Можно подобное сделать не используя функций. По простому, примерно так же как переменные друг другу присваивают?
Дополнен 3 года назад
Язык Си.
Дополнен 3 года назад
Приравнивать элементы массива по отдельности друг другу тоже не надо. Это мне понятно как делать.
int arr[]={1,2,3,4,5};
int massiv[]={1,2,3,4,5};
arr[1]=massiv[2];
Дополнен 3 года назад
Нужно один массив заменить другим. Полностью за один раз.
Лучший ответ
Максим Искусственный Интеллект (212915) 3 года назад
Массив это не одно число, это потенциально большая структура данных. Там может храниться множество элементов, десятки, сотни, тысячи. Нужно понимать, что с точки зрения памяти ты пытаешься скопировать массив целиком. Он будет в памяти присутствовать дважды. Поэтому без копирования массива здесь не обойтись, что может быть затратным. При указателе, что логично, это уже будет не копия, а тот же массив в памяти.
kh fjkgЗнаток (323) 3 года назад
Мой интерес пока что не в затратности памяти, а в изучении.
А задание под такое действие придумать можно. Когда нужна именно 2 одинаковых массива. А не ссылка на один массив.
Простого решения я не нашёл. Предлагают только поэлементно копировать массив циклом.
Максим Искусственный Интеллект (212915) kh fjkg, для этого массив копируется. В C++ должны быть готовые инструменты для копирования, как во многих языках это можно сделать в одну строчку. Тут ещё пишут, что std::array может копировать массивы при присваивании, но я не в курсе. https://stackoverflow.com/questions/16137953/is-there-a-function-to-copy-an-array-in-c-c/16137979
kh fjkgЗнаток (323) 3 года назад
Да, в С++ хорошо. Написано что это в С++ только
Максим Искусственный Интеллект (212915) kh fjkg, а, да, я забыл, что тут про С речь. Но копировать массив придется так или иначе.
kh fjkgЗнаток (323) 3 года назад
Since C++11, you can copy arrays directly with std::array:
kh fjkgЗнаток (323) 3 года назад
Циклом. Печаль.
Максим Искусственный Интеллект (212915) kh fjkg, как минимум это может быть один метод, который потом можно использовать повсеместно.
Остальные ответы
Коля Лисюк Мастер (2169) 3 года назад
Лень читать всё, попробуй через цикл.
Типа arr[i] = massiv[i]
kh fjkgЗнаток (323) 3 года назад
Имеете в виду приравнивать каждый элемент массива по отдельности друг другу? Забыл про это написать. Но такое тоже не надо.
Батаев Дмитрий Просветленный (22877) 3 года назад
Какую ересь ты несёшь!!!! Как можно ПРИРАВНЯТЬ массивы как и переменные? Их ИНИЦИАЛИЗИРУЮТ, то есть переменная получает ЗНАЧЕНИЕ правосторонней переменной
Батаев ДмитрийПросветленный (22877) 3 года назад
А через указатели ты получаешь возможность использовать массив уже созданный и корректировать его значения можно через два указателя, который ссылается на одну область памяти, а не его копию. Через цикл поэлементно можно создать такой же массив, то есть копию в другой области памяти
kh fjkgЗнаток (323) 3 года назад
А я думал почему только справа налево оно работает. Ок. Вообще то я так и думал. Просто пока выражаюсь плохо. Вторую неделю учу Си.
А по вопросу можете ответить?
Батаев Дмитрий Просветленный (22877) kh fjkg, а что не понятного???? int first[5]= {1,2,3,4,5}; int second[5]= {10,20,30,40,50}; если second= first, то это УТЕЧКА памяти в общем-то. Теряется занятая область памяти (((
kh fjkgЗнаток (323) 3 года назад
Через цикл, это опять же надо каждый элемент массива друг другу присваивать. Я в сообщении привёл пример как я разом передал весь массив без цикла.
kh fjkgЗнаток (323) 3 года назад
Не используя звёздочек.
Батаев Дмитрий Просветленный (22877) kh fjkg, сделай его ГЛОБАЛЬНЫМ. Тогда функции не нужно передавать то, что она увидит по-любому
kh fjkgЗнаток (323) 3 года назад
Дело не в конкретном примере. Дело в том что мне надо сделать то что я описал в вопросе. Для обучения.
Я так понял вы описали пример с утечкой памяти и ошибкой. Мне надо без ошибок.
Один из таких примеров я описал в своём вопросе. Я передал массив другому массиву через функцию.

Да, передал я указатель, это правда, но без звёздочек, что мне и нужно было. Можно такое же сделать без функции?
Батаев Дмитрий Просветленный (22877) kh fjkg, void func(int arr[]) { for (int n=0; n<5;n++) printf("%d\t",arr[n]); } int main () int first[5]= {1,2,3,4,5}; func(first); return1; }
kh fjkgЗнаток (323) 3 года назад
Вы напечатали копию моего кода. Я имел в виду без функции надо обойтись и присвоить левому массиву правый массив.
kh fjkgЗнаток (323) 3 года назад
int arr[10]; int massiv[10]; arr=massiv;
Батаев Дмитрий Просветленный (22877) kh fjkg, ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
kh fjkgЗнаток (323) 3 года назад
Пока что никуда передавать не надо. Нужно сначала разобраться как левому массиву присвоить значение правого.
Батаев Дмитрий Просветленный (22877) kh fjkg, ПОЭЛЕМЕНТНО. Такими косяками с указателями грешать модные языки пронраммирования. А потом начинается забивание памяти в гаджетах непонятной хренью, да?
kh fjkgЗнаток (323) 3 года назад
Примерно понимаю. В одном массиве было миллион символов, в другом 1. Это разная выделенная память. Но у меня ведь как то получилось.
Батаев Дмитрий Просветленный (22877) kh fjkg, главное слово как-то. Там где был массив int MIL[10000000]; указатель переписал на int ONE[1]; и про мегабайт можно забыть до перезагрузки устройства в лучшем случае
kh fjkgЗнаток (323) 3 года назад
В данном случае будет не использовано лишнее пространство в массиве massiv?
Указатель arr присваивается указателю massiv.
Или теперь arr не использовано и забыто?

void func(int massiv[] ) { }
int main() {
int arr[]= { 1,2,3,4,5 } ;;
func(arr);
return 0;
}
Батаев Дмитрий Просветленный (22877) В ФУНКЦИЮ ПЕРЕДАЁТСЯ ТОЛЬКО АДРЕС МАССИВА. Это псевдоним, то НЕ ВЫДЕЛЕНИЕ ПАМЯТИ. ЭТО УКАЗАТЕЛЬ НА ПАМЯТЬ
kh fjkgЗнаток (323) 3 года назад
Я так и написал. Указатель. Адрес. Да, я правильно это понимаю.
Батаев Дмитрий Просветленный (22877) kh fjkg, а о чём? ты передал в функцию адрес массива и получил то, что нужно
kh fjkgЗнаток (323) 3 года назад
Я об этом вашем сообщении пишу
-----------------------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
-----------------------------------------------------------
Непонятно какую область памяти забыли безвозвратно. Какого массива. Уточнение нужно чтоб полностью понять
kh fjkgЗнаток (323) 3 года назад
-------------------------------------
void func(int *arr) и void func(int arr[ ]) АНАЛОГИЧНЫ
-------------------------------------
arr будет указателем потому что в ней хранится адрес.
Но сейчас не об этом.
Батаев Дмитрий Просветленный (22877) kh fjkg, сделай массив глобальным и тогда функция его увидит !
kh fjkgЗнаток (323) 3 года назад
Можете пожалуйста объяснить это сообщение?
-------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указатель на первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
-------------------------------
Я выделил два массива arr[] и massiv[]. Потом указатель arr содержится и в arr и в massiv(massiv тоже является указателем).
Моя потеря заключается только в 4 Байт? Столько занимает int в стеке.
Батаев Дмитрий Просветленный (22877) kh fjkg, int arr[]= { 1,2,3,4,5 } ; ЭТО РЕАЛЬНО СУЩЕСТВУЕТ В ПАМЯТИ int massiv[]= { 1,2,3,4,5 } ; ЭТОГО НЕТ В ПАМЯТИ void func(int massiv[]) ЭТО void func(указатель на местоположение массива arr в памяти)
kh fjkgЗнаток (323) 3 года назад
Это называется утечкой в памяти? Я бы назвал это просто нерациональным использованием памяти. 4 байта потеря всего, но зато как быстро передался массив.
Батаев Дмитрий Просветленный (22877) kh fjkg, ТЫ НИЧЕГО НЕ ПОТЕРЯЛ, так как это всего лишь псевдоним, то есть при вызове функции ей через стек передаётся 4 байта памяти указателя на массив arr
Батаев ДмитрийПросветленный (22877) 3 года назад
это на с++, но тоже самое. НЕТ В ПАМЯТИ МАССИВА int massiv[] это всего лишь передаваемый адрес через стек в функцию
kh fjkgЗнаток (323) 3 года назад
То что это псевдоним я написал в своём вопросе выше. Вы пытаетесь мне это "объяснить", потому что я неправильно выразился. Ок.
Про адреса и псевдонимы я знаю. Это как уже я сказал было сказано в вопросе, да криво, но сказано.
Сначала вы говорите что там что то теряется, сейчас уже ничего не теряется.
kh fjkgЗнаток (323) 3 года назад
-----------------------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
------------------------------------------------
kh fjkgЗнаток (323) 3 года назад
Под словом теряется я имел в виду что нерационально используется. )) Сори)
kh fjkgЗнаток (323) 3 года назад
Если я ничего не теряю, то значит буду использовать эту функцию дальше.
Только мне ещё нужен способ присвоить левому массиву правый массив.
Батаев Дмитрий Просветленный (22877) kh fjkg, ПОЭЛЕМЕНТНО. Ибо присвоить один указатель другому это значит потерять один из массивов
user49913 Просветленный (38741) 3 года назад
https://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c
то, что у тебя "получилось" с функцией, по сути эквивалентно варианту со звёздочкой, который ты выше по тексту хотел избежать

не понимаю, что не так с поэлементным присваиванием, на самом деле это единственный правильный вариант
если хочется, можно (и даже нужно) заюзать стандартную функцию типа memcpy
kh fjkgЗнаток (323) 3 года назад
Сейчас замечаю что так оно и есть.
Почему тогда без звёздочки вне функции не получается.
В функции получается без звёздочки, а без функции не получается.
Что то типа этого:
int arr[]={1,2,3,4,5};
int massiv[] = arr;
user49913 Просветленный (38741) потому что в аргументах функции стандарт языка предусматривает неявную трактовку [] как указателя, а просто при объявлении переменных - нет, только и всего да, немного неоднородно, но какая разница
kh fjkgЗнаток (323) 3 года назад
Приятно знать неоднородности.
Понятно. Спасибо.
Похожие вопросы