Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Можно ли создать указатель на указатель?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Илья
Гость





СообщениеДобавлено: Ср Сен 24 2003 10:58    Заголовок сообщения: Можно ли создать указатель на указатель? Ответить с цитатой

Проблема: я хочу создать массив С-строк. Строка (массив символов) это указатель на char, продолжая эту логику, приходим к тому что мне нужно создать указатель на указатель на char. Видимо, я чего-то не правильно понимаю, потому, что компилятор ругается.
Если создать указатель на указатель можно, то как?
Если понятия указатель на указатель не существует, то помогите мне пожалуйста понять словсочетание void** ppvObj из следующего примера:

struct IUnknown
{
virtual BOOL QueryInterface(int nIшd, void** ppvObj);
...
};
Вернуться к началу
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Ср Сен 24 2003 15:43    Заголовок сообщения: Re: Можно Ответить с цитатой

ну и создавай на здоровье! Хоть десятимерный массив !
А вот конкретный пример:
int main( int argc, char **argv )
{
for( int i=0; i
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Ср Сен 24 2003 16:38    Заголовок сообщения: пардон Ответить с цитатой

int main( int argc, char **argv )
{
for( int i=0; i< argc; i++)
printf( "%s\n", argv[ i ] );
}
А что компилятору не нравится ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Илья
Гость





СообщениеДобавлено: Чт Сен 25 2003 09:04    Заголовок сообщения: Компилятору не нравиться мой способ рассуждать Ответить с цитатой

Способ следующий:
char** ppvCh;
ppvCh = new (char*)[10]; //здесь проблемы,
for (int i = 0; i < 10; i++)
ppvCh[i] = new char[10]; //и здесь

Сначала нужно инициализировать указатель на указатель: ppvCh = new (char*)[10]
А потом кадый из указателей на char внутри массива.
Вернуться к началу
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Чт Сен 25 2003 13:26    Заголовок сообщения: компилятор знает что ему не нравится Ответить с цитатой

пиши:
ppvCh = new char*[10];
Ещё вариант - затайпдефить typedef char* pchar;, и объявить pchar ppvCh[10];

но лично я при выделении памяти под массивы и структуры (не классы) предпочитаю использовать calloc-free, потому что очень удобно, если нужно поменять размер массива, использовать realloc
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Илья
Гость





СообщениеДобавлено: Чт Сен 25 2003 20:03    Заголовок сообщения: то есть new (char*)[10] -> new char*[10], и всё заработает? Ответить с цитатой

Конечно попробую, спасибо!

А чем плохо писать delete, new если хочу поменять размер массива?
Вернуться к началу
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Пт Сен 26 2003 08:28    Заголовок сообщения: ага Ответить с цитатой

 
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grayrat



Зарегистрирован: 30.06.2003
Сообщения: 189

СообщениеДобавлено: Пн Сен 29 2003 14:01    Заголовок сообщения: Re: то есть new (char*)[10] -> new char*[10], и всё заработает? Ответить с цитатой

пусть есть указатель на массив
Obj *o;
который сдержит N элементов с данными и мы хотим поменять его размер na M
1) с помощью new-delete
Obj *tmp = new Obj[ M ];
if( tmp )
{
memcpy( tmp, o, N*sizeof(Obj) );
delete o;
o = tmp;
}
else my_error("not enough memory");

2)с помощью realloc:
Obj *tmp = realloc( o, M*sizeof(Obj) );
if( tmp ) o = tmp;
else my_error("not enough memory");

Не только короче, но и быстрее, т.к. если есть возможность, то realloc выделяет дополнительное место следом за объектом. Выгоды очевидны - не нужно копировать данные и меньше фрагментация кучи. Если не будет свободного куска - то тогда ф-я realloc сработает по первому варианту, но всё это скрыто в её реализации. Если нужно уменьшить размер массива, Имеющийся кусок будет усечён до нужной длины, а отрубленный хвост будет возвращёр операционной системе.

Конечно, этот метод непригоден когда нужно вызывать конструкторы и/или деструкторы для каждого элемента массива.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...