|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.04.2018, 01:08 | #1 |
Форумчанин
Регистрация: 17.09.2017
Сообщений: 265
|
массив динамический
1) Зачем когда обьявляем массив нужен указатель?
2) почему если массив передаётся в функцию нужен тоже указатель а не например int a; 3)почему когда массив передаётся элементы отдельно и количество отдельно а не например int *a[n]; Код:
|
09.04.2018, 06:49 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
4) почему трава зелёная?
5) Почему люди не летают как птицы? |
09.04.2018, 18:15 | #3 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
2. См. 1. 3. Потому что распределенная память не хранит информации о размере памяти. В случае записи int a[20] компилятор может "догадаться", но как только, вы использовали массив, как указатель - вся инфа уже утеряна и вы должны ее предоставить. На стеке располагаются короткоживущие объекты, которые удаляются по завершению программной конструкции автоматически (и т.о. указатель на эту память становится не верным). Для долгоживущих объектов, которыми управляет программист - используется "куча" (через new). Последний раз редактировалось alexzk; 09.04.2018 в 18:20. |
|
10.04.2018, 00:50 | #4 |
Форумчанин
Регистрация: 17.09.2017
Сообщений: 265
|
то есть когда работаю с массивом лучше использовать new? а стеком вообще не пользоваться?
|
10.04.2018, 01:29 | #5 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Но, стек он вполне себе ограничен. На маках 512кб на все вообще, на линуксе 2мб ... т.е. да, массив байт видосика туда не влезит. Дело еще в процессоре. Стек аппаратно быстрее раз в 20. Поэтому по времени 20 переменных на стеке = 1 переменной в куче (не точно еесно 20, но примерно). Дело в том, что стек уже распределен в момент запуска программы (потому его и мало - лимит), а для его адресации у процессора есть спец. регистр, хранящий указатель. Для кучи такого нет - вы каждый раз просите ОС выделить вам памяти - и тут все прелести - свап и прочее. Для вещей типа фотошопа, есть техники предварительной резервации (современные компиляторы тоже "втихую" там резервируют, переиспользуют, и на малых размерах ниче не заметно). Но для 20 int эт все не важно, просто к слову о "лучше". Последний раз редактировалось alexzk; 10.04.2018 в 01:37. |
|
10.04.2018, 02:02 | #6 |
Форумчанин
Регистрация: 17.09.2017
Сообщений: 265
|
Когда мы обращаемся к элементу массива мы прорвемся напрямую к ниму или к указателю который ведёт на этот элемент?
|
10.04.2018, 02:13 | #7 | ||
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Цитата:
|
||
10.04.2018, 03:13 | #8 |
Форумчанин
Регистрация: 17.09.2017
Сообщений: 265
|
Cпасибо))) вот допусти код тут int *a указатель на блок памяти в котором содержится массив или на первый элемент и чем указатель на первый элемент отличается от указателя на блок памяти?
Код:
|
10.04.2018, 03:29 | #9 | |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Цитата:
Код:
В вашем случае, собственно, у вас скорее блок памяти и есть. Моя мантра к стековым больше относится (int a[20]). Это вобщем путаница из других языков. В С++ проще считать все блоками памяти и просто указателями. И опять "но". Для стековой записи (int a[20]) инфа о блоке не вся утеряна, и можно делать трюки, например sizeof(a) даст общий размер памяти в байтах, sizeof(a[0]) даст размер элемента в байтах, а sizeof(a) / sizeof(a[0]) даст число элементов. Но это все работает, до тех пор, пока ... Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Динамический массив, массив указателей | alexalisa | Паскаль, Turbo Pascal, PascalABC.NET | 4 | 22.04.2011 21:33 |
динамический массив? | gramp | Microsoft Office Excel | 2 | 26.02.2011 14:41 |
Динамический массив - или всё таки не динамический? | vedro-compota | Общие вопросы C/C++ | 30 | 10.12.2010 23:22 |
Динамический массив | Vito89 | Помощь студентам | 1 | 20.10.2009 01:55 |