Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Двумерный динамический массив: как это работает?

16.08.2018, 18:26. Показов 18076. Ответов 90
Метки нет (Все метки)

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

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

ок. и так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main() {
int i;
for(i=0; i<10; ++i){
int ** array[i]  // создал массив в котором будут находится указатели на динамические массивы.  то есть массив из указателей на указатели.
int j;
j=j+1;
int *dinarray= new int [j]{j}; // cоздал , вернее зарезервировал память для динамического массива и заполнил его. 
 
array[i]=&dinarray; // помещаю адреса динамического одномерного массива в массив созданный для указателей  на эти адреса. то есть беру адрес у динамического массива и помещаю его в массив для адресов. 
}
 
return 0;
 
}
вобщем думаю что это бред. помогите понять где заблудился
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2018, 18:26
Ответы с готовыми решениями:

Пом Динамический - двумерный массив, не работает=(
//--------------------------------------------------------------------------- // Дана целочисленная квадратная матрица. Определить сумму...

Как реализовать двумерный динамический массив?
Доброго дня суток, форумчане! Подскажите пожалуйста, как реализовать двумерный динамический массив?

Как объявить двумерный динамический массив
int *matrix = new int ; че ругается ? а как сделать если без констант надо ?

90
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
16.08.2018, 18:46
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:

C++
1
2
3
4
5
6
7
int **array;
 
array = new int*[10]; // array указывает на массив указателей (10 штук) на тип int
 
// Для каждого указателя выделяем память под новый массив (из 100 элементов в данном случае)
for(int i = 0; i < 10; i++)
    array[i] = new int[100];
Таким образом имеем 10 строк по 100 символов.
2
33 / 22 / 12
Регистрация: 13.09.2017
Сообщений: 74
16.08.2018, 18:54
При создании двумерного динамического массива сначала нужно выделить память для массива указателей на одномерные массивы (т.е указатель на указатель), а затем в цикле выделить память под эти самые одномерные массивы.
Миниатюры
Двумерный динамический массив: как это работает?  
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
16.08.2018, 19:01  [ТС]
Цитата Сообщение от JesD Посмотреть сообщение
При создании двумерного динамического массива сначала нужно выделить память для массива указателей на одномерные массивы (т.е указатель на указатель), а затем в цикле выделить память под эти самые одномерные массивы.

а я динамическую память только выделил для элементов , которые будут содержаться в **array, то есть для dinarray.
а сам array не имеет динамический.
правильно?
0
328 / 81 / 2
Регистрация: 21.07.2018
Сообщений: 112
Записей в блоге: 1
16.08.2018, 22:42
Компилятор запутается где-то на первой строчке внутри цикла.

В обычном коде редко встречается такое ручное управление памятью. Для одномерных динамических массивов есть std::vector. Для многомерных в стандарте пока неудобные классы. Можно найти где-нибудь в boost получше.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
17.08.2018, 00:11  [ТС]
ok


это я учебных целях
так навыдумывал себе, что запутался и вот решил лучше спросить. Выше написали простое создание этого массива, как правильно..
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.08.2018, 12:34
Простой статический массив ( заранее известной и не меняющейся длины )
https://en.cppreference.com/w/cpp/container/array

Простой динамический одномерный массив, в который можно добавлять и удалять элементы
https://en.cppreference.com/w/cpp/container/vector

Внизу обеих страниц - живой редактируемый пример, работу которого можно проверить онлайн на разных компиляторах.
Если будете проверять в своей системе, не забудьте подсказать компилятору версию C++ так, как описано в прикреплённой теме.

Из одномерных можно, например, собрать двумерные так, как Вам нарисовали.
1
17.08.2018, 16:57
 Комментарий модератора 
pcmax, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.3 (порядок именования тем).
0
0 / 0 / 0
Регистрация: 12.06.2018
Сообщений: 5
26.06.2022, 18:51
Цитата Сообщение от JesD Посмотреть сообщение
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:

C++
1
2
3
4
5
6
7
int **array;
 
array = new int*[10]; // array указывает на массив указателей (10 штук) на тип int
 
// Для каждого указателя выделяем память под новый массив (из 100 элементов в данном случае)
for(int i = 0; i < 10; i++)
    array[i] = new int[100];
Таким образом имеем 10 строк по 100 символов.
Извините за ответ в мертвом треде, но у вас изначально ошибка в определении, в вашем случае это вложенный массив, а двумерный массив должен быть в одной области памяти, сам искал т.к. на плюсах не пишу, но тогда наверное проще сделать так для массива размерностью m, n обращение к элементу x, y
C++
1
2
3
int* array = new int[m * n];
 
array[x * n + y] = 10;
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
28.06.2022, 15:43  [ТС]
Цитата Сообщение от GazziFX Посмотреть сообщение
Двумерный динамический массив - это фактически одномерный динамический массив, элементами которого являются указатели на другие массивы:
ну так об этом речь что все не так просто... сначала надо понять, что указатель это просто адрес ячейки, которая может хранить другой адрес. но в С++ указатель может храниться в одном месте, а память под него выделиться в другом месте, а раз память выделиться в другом месте, и содержать он будет в себе другой адрес, то есть указатель, то не получиться чтобы весь массив хранился в одной области памяти, как вы выразились. Если честно то я не совсем понял, что вы понимали под этим. но спасибо что оживили такую замечательную тему
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.06.2022, 16:01
Цитата Сообщение от GazziFX Посмотреть сообщение
в вашем случае это вложенный массив, а двумерный массив должен быть в одной области памяти
Почему должен ? Кому он должен ?

Цитата Сообщение от GazziFX Посмотреть сообщение
int* array = new int[m * n];
Это одномерный массив. То что вы логически, как то его интерпретируете , это уже дело 100500-ое.
Еще грубее и точнее, это указатель на объект типа int.

Цитата Сообщение от pcmax Посмотреть сообщение
ну так об этом речь что все не так просто...
Просто.
Цитата Сообщение от pcmax Посмотреть сообщение
сначала надо понять, что указатель это просто адрес ячейки
Нет, указатель - не просто адрес.

Цитата Сообщение от pcmax Посмотреть сообщение
Если честно то я не совсем понял, что вы понимали под этим. но спасибо что оживили такую замечательную тему
Цитата Сообщение от GazziFX Посмотреть сообщение
на плюсах не пишу
И чего вы от него хотите ?

Отличный же рисунок, от JesD, только в конце должен быть n-1.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.06.2022, 16:16
Цитата Сообщение от pcmax Посмотреть сообщение
двумерный динамический массив. в определении дается , что это объявление динамического указателя на укзатель
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    int(*dinarray)[10] = new int [10][10]; 
 
    int v = 0;
    for(size_t y = 0; y < 10; ++y)
      for(size_t x = 0; x < 10; ++x)
        dinarray[y][x] = ++v;
        
    delete [] dinarray;
}
Цитата Сообщение от GazziFX Посмотреть сообщение
а двумерный массив должен быть в одной области памяти
верно.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему должен ?
см. определение термина "массив" в стандарте языка.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.06.2022, 16:18
Цитата Сообщение от hoggy Посмотреть сообщение
см. определение термина "массив" в стандарте языка.
А определение двумерного массива в стандарте можно сюда ?
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 01:33  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
определение термина
ребята, давайте так.... пусть каждый делает так как считает нужным. я понимаю, что стек и куча это все условные разделения и спорить тут сейчас у меня просто нет времени и желания.
для себя я понял только одно, что не надо слепо верить всяким стандартам и людям, которые пишут книжки и документации.

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Нет, указатель - не просто адрес.
я так не сказал. я сказал, что указатель это адрес ячейки памяти, в которой может храниться другой адрес. я ошибся? поправте пожалуйста
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
29.06.2022, 09:13
Цитата Сообщение от pcmax Посмотреть сообщение
указатель это адрес ячейки памяти, в которой может храниться другой адрес
Указатель - это тип данных, значением которого является адрес.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 16:02  [ТС]
Цитата Сообщение от Folian Посмотреть сообщение
Указатель - это тип данных

сами придумали?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
29.06.2022, 16:16
Цитата Сообщение от pcmax Посмотреть сообщение
сами придумали?
C++
1
void* p;
Эт чё?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
29.06.2022, 21:11
Цитата Сообщение от SmallEvil Посмотреть сообщение
А определение двумерного массива в стандарте можно сюда ?
http://eel.is/c++draft/dcl.array#9
When several “array of” specifications are adjacent, a multidimensional array type is created;
и дальше по тексту.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
29.06.2022, 22:42  [ТС]
Цитата Сообщение от Folian Посмотреть сообщение
void* p;
это указатель на тип void.
а так
Code
1
int* A;
указатель на тип int. вобще надо бы определиться что есть вобще тип данных и для чего он. я считаю, что тип данных в плюсах необходим компилятору, чтобы он знал как с этим работать. когда вы указываете ему что это тип char, к примеру, то компилятор понимает сколько байт нужно выделить и тд. то есть тип определит размер ячейки памяти. пожалуйста не швыряйте стандартами и прочим. стандарты сегодня одни, а завтра -другие. сегодня вам говорят одно и вы дерете горло что-то утверждая, а завтра стандарты поменяются и возможно вы уже будете доказывать то, что еще вчера ненавистно и яростно оспаривали.
кстати
Code
1
void* P;
указатель на тип void способен хранить адрес на любой тип. ну а так если вы хотите сказать что вот такая последовательность символов char* -есть тип, то нужно помнить что char* также разыменовывает, но мы же не называет char* оператором. хотя почему бы и нет.
0
фрилансер
 Аватар для Алексей1153
6477 / 5698 / 1132
Регистрация: 11.10.2019
Сообщений: 15,175
29.06.2022, 23:15
pcmax, упрощённо можно считать так: указатель - это переменная, которая хранит адрес

Добавлено через 29 секунд
Цитата Сообщение от pcmax Посмотреть сообщение
void* P
P - это переменная
void* - это её тип

Добавлено через 1 минуту
Цитата Сообщение от pcmax Посмотреть сообщение
для себя я понял только одно, что не надо слепо верить всяким стандартам и людям, которые пишут книжки и документации.
стандартам надо верить слепо. Ну а люди иногда ошибаются, это да )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2022, 23:15
Помогаю со студенческими работами здесь

Как заполнить двумерный динамический массив?
вот я создал двумерный динамический массив (правильно надеюсь): int row=2; for (int i=0; i&lt;dl; i++){if ('!'==str){row+=1;}}; int...

Как перезаписать двумерный динамический массив?
Здравствуйте! Проблема в том, что при перезаписи массива с большой разницей в строках и столбцах функция работает не правильно. В чем может...

Как создать динамический двумерный массив
Можно ли создать на С++ динамический двухмерный масив? Как? int z , x ; cin &gt;&gt; z ; cin &gt;&gt; x ; int *arr = new int(z); int...

Как заполнить двумерный динамический массив?
Кто может объяснить , как создать динамический двумерный массив и записать в него элементы из файла, при этом подсчитав количество строк и...

Как создать динамический двумерный массив
Динамический одномерный массив p можно сождать примерно так: int N, *p; cin &gt;&gt; N; p= new int А как создать динамический...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru