Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/263: Рейтинг темы: голосов - 263, средняя оценка - 4.76
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

В чем разница между динамическим массивом и статическим?

07.01.2019, 11:59. Показов 57993. Ответов 220
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ребята, я не понимаю различия. вроде читал литературу.

ну вот говорят, что динамический массив, это массив выделение памяти под который будет происходит в процессе выполнения программы.

и тут я залез в онлайн компилятор (с++ 14) и сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main(){
 
int n;
std::cin >> n;
int array[n]; // ну я создал посути динамический массив.
 
int *arr;
arr=new int[n]; // здесь тоже. 
return 0;
}
 
значит они оба динамические?
объясните пожалуйста в чем действительно разница между статическим и динамическим массивом, чтобы я мог точно понимать что есть что
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2019, 11:59
Ответы с готовыми решениями:

Разница между статическим и динамическим полиморфизмом
Добрый день Подскажите пожалуйста какая разница между статическим и динамическим полиморфизмом и пожалуйста на примере и virtual...

В чем разница между вектором и массивом
Я учу язык С/С++ и хотел у вас спросить в чем разница между вектором и массивом ? кроме тогдо что вектор создается vector<int> m; а...

В чем разница между обычным массивом и контейнером
В чем разница между обычным массивом и контейнером?

220
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 11:48
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Не хотят знатоки там источать свет знания
Я извиняюсь, но тот раздел захирел потому, что допуск туда был только по приглашениям. И, например, тов. rat0r при всем желании без этого приглашения там ничего написать бы не смог :) Собственно я и сам там ничего писать не могу, т.к. этого приглашения у меня тоже нет.
К тому же подобные тонкости почти всегда не всплывают просто так. А возникают в контексте какого-то более приземленного вопроса. Я бы не стал осуждать подобное отклонение в специфические области в разделе для новичков. А для тех, кто считает, что эта информация не нужна, лучший способ это изменить - это дать свой вариант, более подходящий для ТС (ну что вы и сделали по итогу).



Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
int (*)[2] - смахивает на указатель на функцию
Это указатель на массив. Тут все честно. Элементами массива из N элементов (первая динамическая размерность) является другой массив, из 2-х элементов, т.к. массив преобразуется к указателю на первый элемент, а первый элемент - это массив из 2-х int, то вот мы и получили указатель на массив из 2-х int.

Цитата Сообщение от Undisputed Посмотреть сообщение
не компилируются.
Надо так:
C++
1
int (*p)[2] = new int[2][2];
Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
По моим тестам данные при таком выделении располагаются в памяти друг за другом (это гарантировано при динамическом выделении памяти под двумерный массив таким образом?)
Да.

Цитата Сообщение от Undisputed Посмотреть сообщение
Это вообще стандартная штука?
Да.
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 11:48
Переменную в int (*)[2] забыл. Но все же не компилируется и с ней.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 11:53
Цитата Сообщение от Undisputed Посмотреть сообщение
Переменную в int (*)[2] забыл. Но все же не компилируется и с ней.
Что-то ты не так делаешь, значит.
Что за ошибку выдает?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.01.2019, 11:56
---
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 11:57
Цитата Сообщение от _stanislav Посмотреть сообщение
нужно вот так объявлять int* p[2];
Если так, то это будет массив указателей.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 12:00
DrOffset,
Это я писал как дополнение к своему первому посту)) Еще не прочитав твой ответ)) У меня в том сообщении отсутствует переменная.
А так все ОК) Спасибо!

В общем логика типа насколько я понял такова:
Каждая строка это указатель на массив поэтому и тип (*)[N], т.е указатель на массив из N элементов.
Единственное что смущает что количество этих строк не уточняется (хотя может для динамических данных это и нормально).

Я просто привык что двумерный динамический массив это либо массив указателей с отдельным выделением каждой строки,
либо хаки вроде operator new (N * M * sizeof(T)) чтоб одной аллокацией выделить и обеспечить плотность кэша или как там оно называется... )) Но такую запись чего то не припомню. Благодарю за разъяснение

Добавлено через 2 минуты
rat0r,
А вам спасибо за то что показали такой код )
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.01.2019, 12:00
Цитата Сообщение от DrOffset Посмотреть сообщение
Если так, то это будет массив указателей.
уже нет
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 12:07
Цитата Сообщение от Undisputed Посмотреть сообщение
В общем логика типа насколько я понял такова:
Единственное что смущает что количество этих строк не уточняется (хотя может для динамических данных это и нормально).
Это для любых массивов нормально. Смотри:
C++
1
2
3
4
5
int a[4][2]; // двухмерный массив
 
int (*p)[2] = a; // OK
 
int (*dp)[2] = new int[4][2]; // OK
Внезапно - то же самое.

Цитата Сообщение от Undisputed Посмотреть сообщение
Каждая строка это указатель на массив поэтому и тип (*)[N], т.е указатель на массив из N элементов.
Каждая строка - это массив. Нет указателей тут.

Вот еще пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using T = int;
 
T a[4];
 
T * p = a; // Все понятно? 4 потеряли!
 
using T1 = int[2];
 
T1 a1[4];
 
T1 * p1 = a1; // Все понятно? 4 потеряли!
 
// T1 - это что? int[2] ! 
// T1 * - это что? int(*)[2] !
Одинаковая логика везде, с любой размерностью.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 12:29
Цитата Сообщение от DrOffset Посмотреть сообщение
Каждая строка - это массив.
Согласен что массив)) Но слегка не догнал мысль в целом
Начало каждой строки имеет свой адрес и сидит где-то в памяти )
Почему начало каждой строки (массива) нельзя назвать указателем?) Особенно если имя массива есть указатель на его первый элемент. Просто в данном случае вместо имени указывается номер строки вот и вся разница (или нет?).

Добавлено через 6 минут
Разве что подобное указание [N] (выбор строки) не выдает указатель а результат его разыменования
ты из за этого говоришь что называть это указателем не правильно?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 12:31
Цитата Сообщение от Undisputed Посмотреть сообщение
Почему начало каждой строки (массива) нельзя назвать указателем?)
Потому что указатель содержит адрес. Но сам адрес может существовать и без какого-либо указателя.

Начало строки - это адрес. А указатель появится только если мы этот адрес в него запишем.

Если думать иначе, то возникают вопросы по типу тех, что задавал ТС выше: "а где хранится этот указатель?".
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 12:32
Цитата Сообщение от DrOffset Посмотреть сообщение
Если думать иначе, то возникают вопросы по типу тех, что задавал ТС выше: "а где хранится этот указатель?".
А, я тебя понял))
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 12:36
Цитата Сообщение от Undisputed Посмотреть сообщение
Разве что подобное указание [N] (выбор строки) не выдает указатель а результат его разыменования
Да, и это тоже. Указатель здесь - это результат преобразования полученного массива в результате разыменования. Т.е. в общем случае вычисление адреса и запись его в некую память. А результат разыменования - это lvalue того типа, что указан при объявлении массива - типа его элементов. Если там не было указателя в качестве элемента, то и результат разыменования тоже не будет указателем.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
09.01.2019, 12:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тут не имелось ввиду автоматическое неявное преобразование. Я имел ввиду вполне законное
C++
1
2
3
4
5
int a[][3] ={
{1,2,3}, {4,5,6}, {7,8,9}
};
int * pa =reinterpret_cast<int*>(a);
for(int i=0; i<9; ++i)cout<<pa[i]<<' ';
В каком месте оно законное?
Ну и опять код с UB при выходе за границу массива.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 12:57
DrOffset,
Раз уж тут тема про массивы разгулялась, то еще хочу спросить:
Такое обращение к последнему элементу
C++
1
2
int arr[2][2] = {{1,2}, {3,4}};
std::cout << arr[0][3];
Мы вроде выходим за пределы массива первого, но исходя из того что элементы массива в памяти хранятся смежно, можно полагать что получим ожидаемый результат. Интересно, является ли это UB по стандарту (думаю да, но хотелось бы уточнить)?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.01.2019, 13:13
Цитата Сообщение от DrOffset Посмотреть сообщение
Я извиняюсь, но тот раздел захирел потому, что допуск туда был только по приглашениям. И, например, тов. rat0r при всем желании без этого приглашения там ничего написать бы не смог Собственно я и сам там ничего писать не могу, т.к. этого приглашения у меня тоже нет.
Хм... А я думал, что отменили уже. Я, например, - могу там писать. И это несмотря на то, что у Вас уровень неизмеримо выше моего.
Непонятно также, каким образом там появляются вопросы вроде "Памагите найти и удалить максимальный индегс массива!!!". Раньше их там не было, а теперь - полно.

ps. Не понимаю, самой сути бытия!

Добавлено через 5 минут
Цитата Сообщение от rat0r Посмотреть сообщение
Ну и опять код с UB при выходе за границу массива.
Там их 9 (девять Карл). И опять-таки.
DrOffset, вот смотрите, вопрос:
Цитата Сообщение от IGPIGP Посмотреть сообщение
объясните, что изменится для практика и/или новичка в разделе С++новички, от того, что практик или новичок уразумеет разницу между неизменяемым левосторонним значением (ссылкой конечно) и константой
Ответа нет, но есть заявление вроде:
Опять UB (и прячутся деревья в темноте...)

Добавлено через 5 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
хотелось бы уточнить
По идее, даже индекс 2 - за пределами. Они там 0 и 1 в обоих измерениях.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 13:25

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
вот смотрите, вопрос
Я думаю, что между давать неверную информацию или не давать вообще я бы выбрал второе. А раз уж мы что-то пытаемся давать, то лучше это стараться делать верно (по мере сил).



Добавлено через 8 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Мы вроде выходим за пределы массива первого, но исходя из того что элементы массива в памяти хранятся смежно, можно полагать что получим ожидаемый результат. Интересно, является ли это UB по стандарту (думаю да, но хотелось бы уточнить)?
Я думаю, что формально является.
По крайней мере ссылки, которые приводились по этому вопросу в болеее ранних темах, я изучил и не нашел никакого противоречия.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
09.01.2019, 13:30
Цитата Сообщение от Undisputed Посмотреть сообщение
Интересно, является ли это UB по стандарту (думаю да, но хотелось бы уточнить)?
Да, является. В одном из примечаний это специально разъясняется
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.compound#3
A pointer past the end of an object ([expr.add]) is not considered to point to an unrelated object of the object's type that might be located at that address.
В C это тоже UB, причём об этом пишут ещё более явно
Цитата Сообщение от http://port70.net/~nsz/c/c11/n1570.html#J.2
The behavior is undefined in the following circumstances:
— An array subscript is out of range, even if an object is apparently accessible with the given subscript (as in the lvalue expression a[1][7] given the declaration int a[4][5])
Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Там их 9 (девять Карл).
9 выходов за границу массива?
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 13:34
IGPIGP,
Да, поэтому и думаю что UB)

DrOffset,
Понятно, спасибо.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.01.2019, 13:35
Undisputed, просто нужно помнить, что говоря об UB, мы всегда говорим о языке. UB - это то, что не оговаривает спецификация языка. UB не означает непредсказуемое поведение в принципе, а лишь отсутсвие предсказуемого поведения в рамках заданной (спецификацией) абстрактной машины. Мы не можем приводить в доказательство детали конкретной реализации, если говорим о языке - это разные уровни абстракции. Именно поэтому, чтобы правильно оценить то, что написано в стандарте, мы должны рассуждать в рамках абстрактной машины, которую описывает документ, а не возможной реализации, с которой мы непосредственно знакомы. Хоть это и соблазнительно иногда.

И да, практику, обычному программисту, это все обычно не нужно. Ему достаточно знать чего делать не рекомендуется, а далее решать задачи применительно к заданной предметной области.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.01.2019, 13:54
rat0r,
Спасибо
Пишу с телефона и не удобно копаться в стандарте
Меня смущает вот что:
Если стандарт гарантирует смежность элементов для двумерного массива и описывает формулу доступа к элементам, то с этой точки зрения такой доступ вроде как можно считать легальным... И если это так тогда возникает некоторое противоречие с цитатой что вы привели...

DrOffset,
Согласен. Но так же хочу отметить что UB это насколько я знаю не только то что не разрешено по стандарту явно. В некоторых местах стандарта есть явное указание что "так не пишите, это UB". Получается что UB это то что стандарт не разрешает явно + то что явно отмечено в стандарте как UB
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2019, 13:54

В чем разница между массивом строк и List<string>?
А есть ли принципиальная разница между string array1 и List&lt;string&gt; array2 ? И если есть, то в чем она заключается?

Разница между статическим и экземплярным методом
В книге уже несколько раз встречается понятие статического и экземплярного метода, но не поясняется конкретно, в чем между ними разница,...

В чем разница между простым линейным списком, и динамическим линейным списком?
вопрос в теме

Разница между массивом структур и очередью
Поясните пожалуйста разницу между массивом структур и очередью.

VPN не подключается со статическим IP-адресом (ошибка 720), с динамическим — все работает
Всем привет! В магазине имеется VPN соединение подключающееся к серверу на складе. При получении ip-адреса автоматически подключение...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru