| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > передача функциям многомерных массивов |
| Автор: ShadowC 21.9.2011, 22:42 | ||||||||
| собственно вот в чем возник вопрос что бы передать обычный массив мы поступаем так:
это как известно передача по ссылке,
это соответвенно передача по значению,все это для обычных массивов....
вот так выглядит передача полного многомерного массива функции а вопрос вот в чем заключается,как расшифровать такую передачу многомерного массива.
|
| Автор: mes 21.9.2011, 23:38 |
нет.. такие выводы по предоставленым фрагментам кода сделать нельзя.. как будут передаваться параметры зависит от того как объявлена функция.. а объявление Вы не привели.. |
| Автор: ShadowC 22.9.2011, 07:00 | ||||||||
функция лишь принимает то что мы ей передаем,например
соответственно функция выглядит так
заголовок функции лишь покажет разрешу ли я модифицировать массив в его исходных ячейках,тоесть если захочу запретить,заголовок будет выглядить так
если ты знаешь другие способы определить принимающую аргумент функцию,то поделись пожалуйста |
| Автор: spyswamp 22.9.2011, 09:03 | ||
ShadowC,
не подходит тебе? Ну, и размер отдавать. Хотя была в C функция, с помощью которой можно было определять размеры (длину) таких структур. Не помню название, но в стандартных заголовках есть. |
| Автор: maydjin 22.9.2011, 09:27 | ||||
| Во-первых, учи матчасть и не заявляй столь авторитетно о том, что не до конца понимаешь(ссылки тут ни к лесу ни к огороду). Во-вторых в 1 примере кода у тебя передаеться указатель на 1 элемент массива, а во втором отдельный элемент массива, что при приведенном тобой прототипе должно вызвать ошибку компиляции, если конечно, в массиве не храняться массивы того же типа. В с++ массивы представляються указателем на первый элемент, т.е:
Т.к. масив указатель на первый элемент, двумерный массив - массив указателей на 1-ые элементы массива т.е:
Да, и в-третьих если всё это для самообучения то дерзай, а если с какой то практической целью, то http://www.cplusplus.com/reference/stl/. |
| Автор: ShadowC 22.9.2011, 09:33 | ||||||||||||
вот это тот отрезок кода.
я знаю что такой вызов передает 1 строчку массива,но как это работает я не понимаю... Добавлено через 1 минуту и 40 секунд
вот это не понял Добавлено через 4 минуты и 7 секунд
вопрос заключается в том как это дело работает |
| Автор: newbee 22.9.2011, 09:38 | ||
Тут я наврала. int arr[2][3] нужно указывать (первый индекс можно опустить и передавать как еще один аргумент). Добавлено @ 09:44 Передается указатель на первый элемент массива {92,73}. Добавлено @ 09:47 Массив любой мерности можно привести к указателю на его первый элемент и далее по известным смещениям (индексам) получить доступ к любым данным в этом массиве. Если с некоторой натяжкой еще можно сказать, что массив является указателем, то гооворить о том, что двумерный массив является указателм на указатель, неверно. |
| Автор: maydjin 22.9.2011, 09:54 | ||
Не то что хотел бы оспорить, но разве:
хоть как то опровергает то , что переменные через которые мы обращаемся к массиву, на сколько я знаю, всегда являются указателями? И память то естественно линейна для любых структур данных, т.к. в конечном итоге она линейна на уровне железок. И в c++ "двумерный" массив является всего лишь массивом указателей, и даже не кем не гарантированно, что указателей именно на массивы и именно на массивы одного типа или размера, за исключением частного случая когда размерности задаються на этапе компиляции. P.S. многомерных массивов в c++ кстати вообще не существует |
| Автор: newbee 22.9.2011, 10:00 | ||
Ну это как посмотреть. int a[2][3]..[128] вполне можно считать многомерным массивом, vector<vector... <int>...> - тоже. |
| Автор: ShadowC 22.9.2011, 10:05 | ||
почему тогда такого рода передача функции 1 строки работает,а вывод одной строки не работает?
вызовет ошибку |
| Автор: newbee 22.9.2011, 10:05 | ||
Добавлено через 1 минуту и 29 секунд ShadowC, давай код целиком, мы не телепаты. |
| Автор: ShadowC 22.9.2011, 10:16 | ||||
ты уверен что этого хочешь? там код на 200+ строчек это пример из книги дейтлов,там лишь сказано,что многомерный массив может быть представлен одномерными,но как это делается не сказано |
| Автор: maydjin 22.9.2011, 10:41 |
| Мде действительно facepalm. Указатель можно представить как массив всегда, обратное не верно. Т.С. слушай newbee. |
| Автор: spyswamp 24.9.2011, 18:58 |
| newbee, про определение размеров - это я вспомнил какие-то свои давние эксперименты. Сейчас слегка погуглив, нашел пару вещей: http://msdn.microsoft.com/en-us/library/z2s077bc(VS.80).aspx http://developer.apple.com/library/mac/#documentation/Darwin/Reference/Manpages/man3/malloc_size.3.html Соответственно, это нестандартные вещи, но имеют место быть. Хотя, раз не стандартные, то можно смело на них забить и забыть. Моя неправда. Далее, я и не говорил про то, что многомерный массив и "указатель на указатель на..." (нужное количество вставить) - это одно и то же. Я просто спросил, чем не подходит такой вариант. Кстати, там зря я const плюхнул, т.к. из названия функции modif() можно сделать некие выводы. Личное мнение: при динамическом выделении памяти вряд ли кто-то будет при передаче аргументов заморачиваться со скобочками и т.п. Проще (и очевиднее при чтении кода) когда работа с массивом идет через указатель. Остальное годится сугубо в академических целях для понимания механизма хранения и передачи информации (массив). Сам использую контейнеры вместо низкоуровневых структур. А так, да, с точки зрения хранения данных в памяти, нет никакой "многомерности". ShadowC, вот нашел еще тебе кой-чего почитать по этому поводу (человек, на мой взгляд, доступно написал, чего повторяться): http://www.rsdn.ru/forum/cpp/443690.1.aspx |