Форум программистов, компьютерный форум CyberForum.ru

Динамический массив указателей - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 202, средняя оценка - 4.60
darkAngel
Технофашист
206 / 187 / 3
Регистрация: 11.03.2009
Сообщений: 829
04.09.2010, 08:34     Динамический массив указателей #1
Чегото не пойму такое вообще возможно?
Странно, что при объявлении можно не указывать размерность: int *a[];
Но как потом память выделять не известно.

Добавлено через 2 минуты
p.s. прошу не путать с указателем на массив.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
04.09.2010, 15:19     Динамический массив указателей #2
Память обычно выделяется инициализацией:
C
1
2
int a, b, c;
int* array[] = {&a, &b, &c};
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
05.09.2010, 22:26     Динамический массив указателей #3
darkAngel, объявление int *a[]; эквивалентно int **a;
А память выделяется так:
C
1
2
3
  a = malloc(10*sizeof(int *));
  for(i=0; i<10; i++)
    a[i] = malloc((5+i)*sizeof(int));
Получится такая "косая" матрица
1-я строка - 5 элементов
2-я - 6
...
10-я - 14
А можно и по-другому, скажем чтоб все строки были одинаковы...
Это уж твое дело, управляешь этим ТЫ
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.09.2010, 22:37     Динамический массив указателей #4
Цитата Сообщение от Day Посмотреть сообщение
darkAngel, объявление int *a[]; эквивалентно int **a;
Ничего подобного! Выражение int **a; обявляет указатель на указатель на int; а int *a[]; объявляет массив указателей, но в таком виде оно не правильно, и так даже не скомпилируется. Если при объявлении массива не указывается размер, вместе с объявлением должна быть инициализация значений, тогда компилятор вычисляет размер автоматически:
C
1
2
3
int **a; // при объявлении инициализация не требуется
int *b[] = { NULL, NULL, NULL }; // создаёт массив из трёх указателей, инициализирует их значением NULL
int *c[]; // выдаст ошибку при компиляции
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
05.09.2010, 22:44     Динамический массив указателей #5
easybudda, Приношу извинения. Ты прав.
darkAngel
Технофашист
206 / 187 / 3
Регистрация: 11.03.2009
Сообщений: 829
06.09.2010, 08:13  [ТС]     Динамический массив указателей #6
int *b[] = { NULL, NULL, NULL };
Размер массива мне не известен заранее.
Массив указателей - это поле моего класса, на сколько объектов он будет ссылаться - будет известно лишь в процессе инициализации.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.09.2010, 09:05     Динамический массив указателей #7
Цитата Сообщение от darkAngel Посмотреть сообщение
Массив указателей - это поле моего класса, на сколько объектов он будет ссылаться - будет известно лишь в процессе инициализации.
На форуме полно примеров!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
int **matrix, rows, columns;
/* инициализировать rows и columns */
matrix = new int* [ rows ];
for ( int i = 0; i < rows; ++i )
  matrix[i] = new int [ columns ];
...
for ( int i = 0; i < rows; ++i ){
  for ( int j = 0; j < columns; ++j ){
    /* что-то сделать с matrix[i][j] */
  }
}
...
for ( int i = 0; i < rows; ++i )
  delete [] matrix[i];
delete [] matrix;
...
C - стиль, с классами не использовать!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdlib.h>
#include <stdio.h>
...
int ** matrix, rows, columns, i, j;
/* инициализировать rows и columns */
if ( ( matrix = (int**)malloc(sizeof(int*) * rows) ) == NULL ){
  perror("malloc");
  exit(1);
}
for ( i = 0; i < rows; ++i ){
  if ( ( matrix[i] = (int*)malloc(sizeof(int) * columns) ) == NULL ){
    perror("malloc");
    exit(1);
  }
}
...
for ( i = 0; i < rows; ++i ){
  for ( j = 0; j < columns; ++j ){
    /* что-то сделать с matrix[i][j] */
  }
}
...
for ( i = 0; i < rows; ++i )
  free(matrix[i]);
free(matrix);
...
darkAngel
Технофашист
206 / 187 / 3
Регистрация: 11.03.2009
Сообщений: 829
06.09.2010, 10:09  [ТС]     Динамический массив указателей #8
easybudda, арррр... попросил же не путать с указателем на массив.

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

Добавлено через 7 минут
p.s. вот, в кратце:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct top{   //Такой тип
...
};
top *N[50];   //Нужен такой массив указателей, только количество элементов мне не известно при компиляции
top *A;        //Указатель на массив, где последовательно хранятся элементы типа top
...
/*выделяем память под массив типа top, на начало которого ссылается указатель A*/
...
/*Теперь мне выборочно нужно ссылатся на некоторые элементы из множества A*/
N[0] = &A[3];
N[1] = &A[17];
N[2] = &A[22];
И повторяю, проблема в том, что не известна размерность массива N до компиляции
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.09.2010, 10:42     Динамический массив указателей #9
Цитата Сообщение от darkAngel Посмотреть сообщение
И повторяю, проблема в том, что не известна размерность массива N до компиляции
Ну и в чём проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
...
struct Top{
...
};
int tops_needed;
...
Top * tops = new Top [ tops_needed ];
for ( int i = 0; i < tops_needed; ++i )
  tops[i] = another_top_object;
...
delete [] tops;
...
darkAngel
Технофашист
206 / 187 / 3
Регистрация: 11.03.2009
Сообщений: 829
06.09.2010, 10:52  [ТС]     Динамический массив указателей #10
В том что выделяется память и создаётся копия, а мне нужна не копия данных, а указатель на уже выделенную память.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Top{
int d;
...
};
int tops_needed;
...
Top A;                             //Создали объект A типа Top и инициализировали поле d
A.d = 5;              
 
Top * tops = new Top [ tops_needed ];
for ( int i = 0; i < tops_needed; ++i )
  [B]tops[i] = A;[/B]                            //Создали копию объекта A
 
A.d = 7;                    //Изменили значение поля d
Выводим данные:
A.d равно 7
tops[0].d равно 5
ибо копия
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.09.2010, 11:33     Динамический массив указателей #11
Цитата Сообщение от darkAngel Посмотреть сообщение
выделяется память и создаётся копия, а мне нужна не копия данных, а указатель на уже выделенную память.
C++
1
2
3
4
5
6
7
8
9
10
11
...
Top a, b, c;
int numTops = 3;
Top ** pTops = new Top * [ numTops ];
pTops[0] = &a;
pTops[1] = &b;
pTops[2] = &c;
for ( int i = 0; i < numTops; ++i )
  std::cout << pTops[i]->d;
...
delete [] pTops;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2010, 14:08     Динамический массив указателей
Еще ссылки по теме:

C++ динамический массив указателей на объекты
Динамический массив указателей C++
C++ Динамический массив с использованием указателей

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

Или воспользуйтесь поиском по форуму:
for.joke
Сообщений: n/a
25.12.2010, 14:08     Динамический массив указателей #12
Цитата Сообщение от easybudda Посмотреть сообщение
Ничего подобного! Выражение int **a; обявляет указатель на указатель на int; а int *a[]; объявляет массив указателей, но в таком виде оно не правильно, и так даже не скомпилируется.
С помощью выражения int **a; можно спокойно создать динамический массив указателей)

Добавлено через 22 минуты
Вот допустим динамический массив указателей на объекты класса, с конструктором:
C++
1
2
3
4
5
6
ex::ex(char* s, int n)
{
    str=new char[strlen(s)+1];
    strcpy(str,s);
    num=n;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main()
{
    int nm,n;
        cin>>n;
 
    ex **spisok= new ex*[n];
    char **temp=new char*[n];
    for(int i=0;i<n;i++)
        temp[i]=new char[50];
    
    for(int i=0;i<n;i++)
    {
        cin>>temp[i];
        cin>>nm;
        spisok[i]= new ex(temp[i], nm);
        cout<<spisok[i]->getstr()<<"\t"<<spisok[i]->getint()<<"\n";
    }
 
}
Yandex
Объявления
25.12.2010, 14:08     Динамический массив указателей
Ответ Создать тему
Опции темы

Текущее время: 23:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru