Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Илья Гость
|
Добавлено: Ср Сен 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 сработает по первому варианту, но всё это скрыто в её реализации. Если нужно уменьшить размер массива, Имеющийся кусок будет усечён до нужной длины, а отрубленный хвост будет возвращёр операционной системе.
Конечно, этот метод непригоден когда нужно вызывать конструкторы и/или деструкторы для каждого элемента массива. |
|
Вернуться к началу |
|
|
|