Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 257
1

Для чего нужны статические массивы?

05.01.2019, 07:05. Показов 5491. Ответов 11

Author24 — интернет-сервис помощи студентам
Никак не могу понять, для чего они нужны в программировании, ведь есть динамические и их можно сделать константными , чтобы не менялся размер массива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2019, 07:05
Ответы с готовыми решениями:

Для чего нужны переменные, и прочее типа, константа, типы , массивы и т.к.д ?
Для чего нужны переменные, и прочее типа, константа, типы , массивы и т.к.д

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно...

Для чего нужны интерфейсы?
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства,...

Для чего нужны файлы с расширением .h, .c?
Не подскажите, для чего нужен (.h) и (.c) файл? А (.cpp)? Я читал, что это заголовочный файл, но за...

11
243 / 268 / 219
Регистрация: 14.11.2016
Сообщений: 1,043
05.01.2019, 09:34 2
Лучший ответ Сообщение было отмечено Ivan _pupkin как решение

Решение

Динамические структуры данных – это структуры данных, память под которые выделяется и
освобождается по мере необходимости; тип может быть известен во время выполнения.
Статическая память хранит глобальные переменные и константы; размер определяется при
компиляции; размер памяти остается неизменным в процессе работы программы.

Допустим я разраб игры, и я знаю что у меня 100 различных персонажей, и я знаю что их кол-во не будет изменяться. Я могу создать глобальный массив статического типа на 100 элементов с названием каждого персонажа.
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
05.01.2019, 12:01 3
Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
Никак не могу понять, для чего они нужны в программировании, ведь есть динамические и их можно сделать константными , чтобы не менялся размер массива.
Кусок динамической памяти выделенной для блока определённого типа данных называют массивом не имея в виду, что данный "массив" это тип сам по себе. Тут имеют ввиду контракт. Сам указатель (не *void) имеет перегруженный оператор индексного обращения и этим самым предлагает интерфейс массива. Размер во время исполнения изменить нельзя. Но можно освободить этот кусок или передать другому указателю для дальнейшего использования и утилизации, а старому указателю выделить кусок нового размера. То есть, если не работать с адресами как со значениями напрямую, то создаётся видимость того, что "массив" изменил размер. Для понимания происходящего нужно научиться работать со статическими и автоматическими массивами-типами, а затем поучиться выделять память как в стиле С (имхо) так и в стиле С++. Сначала под единичные данные, потом под одномерные массивы. А потом уже каскадные выделения, когда в одном акте выделяются указатели на то что будет выделено далее, до тех пор пока не настанет черёд выделить память под одномерные цепочки данных. У динамических массивов размер кусков одного каскада может отличаться, кстати. Это редко бывает нужно и об этом часто забывают, но факт.

Нативный массив это тип данных в С++. Это значит, что размер должен быть известен во время компиляции. То есть объявления int a[123]; и int a[124]; объявляют два разных типа. Нативные массивы создаются во время компиляции и они не тратят время исполнения. Размер во время исполнения изменить нельзя. Как и у любого другого типа.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,887
05.01.2019, 12:55 4
Статическими массивами пользоваться проще. Нет возни с выделением - проверкой - освобождением (вы ведь не забываете про ВСЕ эти этапы, не так ли?). В некоторых случаях быстрее доступ. Более простая реализация и использование многомерных массивов: напоминаю, с С/С++ динамических многомерных массивов нет вообще.
1
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 257
05.01.2019, 13:34  [ТС] 5
IGPIGP, не многое понял , но очень интересно

Добавлено через 2 минуты
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Нет возни с выделением - проверкой - освобождением (вы ведь не забываете про ВСЕ эти этапы, не так ли?).
Да , я стараюсь уделять этому особое внимание, поскольку часто слышу, что с++ и с сложны как раз , из-за этого.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
напоминаю, с С/С++ динамических многомерных массивов нет вообще.
А как это нету? Ведь можно создать динамическую матрицу, или я чего-то не знаю?
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
05.01.2019, 14:49 6
Лучший ответ Сообщение было отмечено Ivan _pupkin как решение

Решение

Ivan _pupkin, в C/C++ нет матриц, а то, что обычно называют динамически созданным многомерным массивом, ни что иное, как массив массивов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int **a; // указатель на одномерный массив указателей int*
a = new int* [n];
for (int i = 0; i < n; i++) {
    // Каждый массив для второго измерения создается отдельно.
    // Их размеры могут быть разными.
    a[i] = new int [i + 1];
}
 
// В итоге получили не двумерный массив (матрицу) MxN, 
// а массив размера N из массивов разной длины.
 
// Обращение к элементам: в первой скобке индекс массива, 
// во второй скобке индекс элемента этого массива.
cout << a[2][1];
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
05.01.2019, 15:31 7
Лучший ответ Сообщение было отмечено Ivan _pupkin как решение

Решение

Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
не многое понял
Ivan _pupkin, не стесняйтесь переспросить.
Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
но очень интересно
Я старался.
Вообще, Вам как новичку простительно и мы все идём на поводу, в таких случаях. Но имеет смысл заметить, что массивы объектов в динамической памяти, это не динамические (расширяющиеся) массивы. А нативные массивы, это что-то третье. Есть ещё контейнеры std::array<> и std::vector<> и это четвёртое и пятое. А ещё есть std::unique_ptr который умеет владеть "массивом" в динамической памяти.
Это всё не ляжет так как должно бы лечь, если не начать с плотной упаковки простых вещей. Посмотрите на рекомендацию, начать с простых встроенных типов (обходя char десятой дорогой! Тип bool тоже не для данного случая).
Вообще, сравнение "массивов" в динамической памяти с нативными массивами - вопрос разноплановый и многослойный. Но всё начинается от связи понятия "тип" с понятием "адресуемый участок памяти". Старайтесь понять то, что возможно, но хорошо. Остальное - потом.
1
3 / 3 / 1
Регистрация: 17.12.2018
Сообщений: 257
05.01.2019, 15:59  [ТС] 8
А вы случаем не знаете , как можно просматривать эл-ты динамической матрицы?
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
05.01.2019, 17:16 9
Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
А вы случаем не знаете , как можно просматривать эл-ты динамической матрицы?
Цитата Сообщение от valen10 Посмотреть сообщение
Ivan _pupkin, в C/C++ нет матриц
Вы имеете в виду 2-D "массив"? Это зверь представляет из себя одномерный массив указателей на одномерные массивы заявленного типа. То есть, доступ осуществляется двойным индексированием. С виду оно похоже на таковое и у обычных (нативных) 2-D массивов (хотя они внутренне одномерны в отличие от "динамических").
зы. всё в кавычках относится к блокам выделенным в динамической памяти.

Добавлено через 25 минут
Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
матрицы?
Есть ещё очень крутой зверь
https://en.cppreference.com/w/cpp/numeric/valarray
Но для 2D случая его надо бы обернуть шаблоном вроде этого:
https://stackoverflow.com/ques... s-2d-array
Off the top of my head:
и далее.
Но Вам это ещё не надо. Поэтому старайтесь избегать матриц векторов и пр. маттерминов в области реализации. Пусть они останутся в предметной области.
1
243 / 268 / 219
Регистрация: 14.11.2016
Сообщений: 1,043
05.01.2019, 17:43 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
у обычных (нативных) 2-D массивов (хотя они внутренне одномерны в отличие от "динамических").
Маленькая пародия
C++
1
2
int arr = new int[rows * cols];
std::cout << arr[(i * rows) + j];
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
05.01.2019, 17:46 11
Цитата Сообщение от anapshy Посмотреть сообщение
Маленькая пародия
Если сделать обёртку и перегрузить операторы-индексаторы то будет как настоящий.
1
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,887
06.01.2019, 16:08 12
Цитата Сообщение от Ivan _pupkin Посмотреть сообщение
А как это нету? Ведь можно создать динамическую матрицу, или я чего-то не знаю?
Нет. Наиболее близкое - отображение многомерного массива на одномерный:
C
1
2
int *arr = ...
arr[ x + y*w + z*w*h ] = ...
То, что часто выдают за двумерный массив
C
1
2
int **arr;
arr[ x ][ y ] = ...
является даже не массивом массивов, а массивом указателей, то есть не является монолитным объектом, а размазан в общем случае по всей памяти. Не говоря уж о необходимости следить за выделением памяти для каждого из указателей и соответствии размеров.
Есть и более экзотические имитации многомерных массивов, но они применяются еще реже.
1
06.01.2019, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2019, 16:08
Помогаю со студенческими работами здесь

Для чего нужны заголовочные файлы?
Ещё раз всем здрасьте , последний вопрос в котором я не могу разобраться - Для чего нужны...

Для чего нужны callback-функции
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.

Для чего нужны вложенные структуры?
Скажите пожалуйста для чего нужны вложенные структуры и где их используют?

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее...

try catch throw для чего нужны?
Для чего нужны эти операторы? Линканите пожалуйста статью, где доходчиво объяснено их применение,...

Для чего нужны битовые операции?
Здравствуйте. Дошел в книге Стенли до битовых операций, но никак не могу понять их предназначение....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru