Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Про указатели, помогите пожалуйста разобраться 
V
    Опции темы
seravr
Дата 26.2.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Товарищи, подскажите пожалуйста.
В хидере класса я объявляю указатель на массив указателей, типа вот так:
int** data;

или надо вот так:

int* data[];
Но в этом случае компилятор ругается, что надо определить размер массива, тогда я пишу так:

int* data[size];
в этом случае выдает варнинг

Подскажите пожалуйста как правильно вообще это организовать

Вот пример кода:

class My
{
public:
    My(int SIZE=100);
    ~My();

private:
    size;// размер массива указателей
    int* data[size];// массив указателей
    // или надо int** data???
};

А в файле .cpp в конструкторе мне надо инициализировать массив указателей нулями, т.е. NULL.
Я не пойму как это сделать, толи в .cpp явно инициализировать массив указателей(его размер и на что они в данный момент указывают,т.е. NULL), то ли просто писать в конструкторе что-то типа :

... 

My::My(int SIZE)
    :size(SIZE)
{
    for(int i=0;i<size;i++)
        data[i]=NULL;
}

...

Дело в том, что если я так пишу, то операционка выдает что-то типа: попытка записи в защищенную память, и аварийно завершает программу.

Прошу пожалуйста помочь, как правильно мне это организовать

Спасибо всем.
Очень ценю мнение каждого.
PM MAIL   Вверх
mes
Дата 26.2.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(seravr @  26.2.2009,  12:06 Найти цитируемый пост)

Дело в том, что если я так пишу, то операционка выдает что-то типа: попытка записи в защищенную память, и аварийно завершает программу.

Указатель объявили, а куда он должен указывать не показали...




--------------------
PM MAIL WWW   Вверх
seravr
Дата 26.2.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



я их инициализирую нулями 
 data[i]=NULL;
PM MAIL   Вверх
mes
Дата 26.2.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(seravr @  26.2.2009,  12:06 Найти цитируемый пост)

А в файле .cpp в конструкторе мне надо инициализировать массив указателей нулями, т.е. NULL.

data = NULL;

Цитата(seravr @  26.2.2009,  12:06 Найти цитируемый пост)

Подскажите пожалуйста как правильно вообще это организовать

Ваш вопрос представляет кучу вариантов для толкования... И ответить на него кратко, не зная основной задачи (*) не получится.

(*) для чего вобще Вы собираетесь использовать указ. на массив указ.?   двухмерный массив ?

Добавлено @ 13:23
Цитата(seravr @  26.2.2009,  12:19 Найти цитируемый пост)
я их инициализирую нулями 
 data[i]=NULL; 

как Вы можете инициализировать "их", если не знаете где "они" расположены ?! 
Вы сами написали:
Цитата(seravr @  26.2.2009,  12:06 Найти цитируемый пост)
указатель на массив указателей

так что , чтоб работать с массивом_указатeлей, нужно вначале проинициализировать указатель_на_массив_указателей.

Это сообщение отредактировал(а) mes - 26.2.2009, 13:26


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 26.2.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



А какую область памяти ты инициализируешь нулями ? ты под указатели не выделил память вот тебе и ошибка.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
seravr
Дата 26.2.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



вообщем, это нужно для создания простой базы данных, в ней имеется указатель на объекты(объектов много, для простоты пусть они будут типа int )
PM MAIL   Вверх
C/L
Дата 26.2.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



Как я понял size здесь не константа, заранее не известен, поэтому

class My
{
public:
    My(int SIZE=100);
    ~My();

private:
    size;// размер массива указателей
    int** data;// массив указателей
    // или надо int** data???
};


My::My(int SIZE)
    :size(SIZE)
{
    data = new *int[size];
    for(int i=0;i<size;i++)
        data[i]=NULL;
}

My::~My()
{
    ......
    delete data[];
}

PM MAIL WWW ICQ   Вверх
mes
Дата 26.2.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(seravr @  26.2.2009,  12:29 Найти цитируемый пост)
в ней имеется указатель на объекты(

Мне кажется Вы злоупотребляете словом "указатель" - и из за этого проблемы с пониманием того чего хотите получить.

Вам нужен линейный контейнер для хранения объектов  ?
1. std::vector<T> v; - рекомендуемая альтернатива динамическому си-массиву.
2. T mas[size]; - статический массив
3. T* mas; mas = new Т[size]; - динамический массив, скрытый за указателем.
где Т - Ваш тип



Это сообщение отредактировал(а) mes - 26.2.2009, 13:40


--------------------
PM MAIL WWW   Вверх
seravr
Дата 26.2.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



спасибо Всем, начал понимать.

А могу я сделатьтак:

 class My
{
public:
    My(int SIZE=100);
    ~My();

private:
    size;// размер массива указателей
  [b]  int** ptrData;// указатель на массив указателей
   int* data[];// собственно, сам массив указателей

// здесь нужно писать data[] или надо data[размер]???[/B]
};


My::My(int SIZE)
    :size(SIZE)
{
    data = new *int[size];
    for(int i=0;i<size;i++)
        data[i]=NULL;

 ptrData=data[0];
}

My::~My()
{
    ......
    delete data[];
}

Добавлено @ 13:47
ребята, я что то запутался, если мы пишем 

int** data

это ведь указатель на массив указателей
Тогда почему мы инициализируем его типом *int[] так в конструкторе:
data = new *int[size];



Это сообщение отредактировал(а) seravr - 26.2.2009, 13:48
PM MAIL   Вверх
C/L
Дата 26.2.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 31.7.2004
Где: Самара

Репутация: нет
Всего: 1



В С++ массив и указатель одно и то же. Массив = указателю на первый элемент
PM MAIL WWW ICQ   Вверх
zim22
Дата 26.2.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(seravr @  26.2.2009,  13:42 Найти цитируемый пост)
data = new *int[size];

надо так:
Код

data = new int*[size];



--------------------
PM MAIL   Вверх
Dmi3ev
Дата 26.2.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



возьмем для примера массив 4х3, чтобы не было квадратика, а то не поймешь...
Код

int n=4;
int m=3;

int **a;//просто создали указатель

a=new int*[m];//можно сказать (для понимания), что выделили память под столбцы


опять же для понимания, сейчас у нас вот так
  0    1    2
[...] [...] [...]
те массив у нас уже есть, а нам нужен массив массивов, те
     0    1    2
0 [...] [...] [...]
1 [...] [...] [...]
2 [...] [...] [...]
3 [...] [...] [...]
т.е. в кадый из элементов первого массва запихнуть по массиву
  0                1            2
[массив] [массив] [массив]
это делается вот так
Код

for (int i=0; i<m; i++)
 a[i]=new int[n];

все это только для объяснения, чтобы человек понял... что ваще происходит

Это сообщение отредактировал(а) Dmi3ev - 26.2.2009, 14:08


--------------------

PM MAIL   Вверх
seravr
Дата 26.2.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Друзья, как я понял, нужно в хидере объявить int** data;
а в файле .cpp нужно писать data = new int*[size];


т.е. получается что int** data; и int* data[]; -это одно и тоже???
PM MAIL   Вверх
Carnivore
Дата 26.2.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.12.2008
Где: St.-Petersburg

Репутация: нет
Всего: нет



Цитата(C/L @  26.2.2009,  13:49 Найти цитируемый пост)
В С++ массив и указатель одно и то же

А вот и нет  smile 
PM MAIL   Вверх
seravr
Дата 26.2.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Dmi3ev, преогромнейшее спасибо Вам, разобрался
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1194 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.