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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чем является void** ? Чем является void** ? 
:(
    Опции темы
Merlin_ua
Дата 3.11.2011, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чем является void** ?

Например, есть функция принимающая в качестве аргумента void**

int F(void** x);

Что это: указатель на указатель?
PM MAIL   Вверх
Alexeis
Дата 3.11.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Merlin_ua @  3.11.2011,  15:10 Найти цитируемый пост)
Что это: указатель на указатель? 

  Ну представь что тебе нужно инициализировать указатель в некоторой функции (выделить память). Тут несколько вариантов, либо передать указатель по ссылке в функцию, либо адрес указателя (т.е. указатель на указатель), либо вернуть как значение.
  Еще это может понадобиться если создаешь массив указателей (или массив массивов).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Merlin_ua
Дата 3.11.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А почему просто не использовать ссылку на указатель?
PM MAIL   Вверх
bsa
Дата 3.11.2011, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Merlin_ua, может потому что язык Си, а не С++?
На твой вопрос ответить очень сложно. Так как ситуации бывают разные.
Кстати, а такой код тебя смущать не будет?
Код
typedef void* HANDLE;

void UpdateHandle(HANDLE *h);

PM   Вверх
Merlin_ua
Дата 3.11.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смущает smile  Я думал, что ответ будет простым и однозначным, поэтому не стал приводить кусок кода. Сейчас попробую упростить код, дабы лишнего было по меньше. Кстати, язык С++.
PM MAIL   Вверх
baldina
Дата 3.11.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Merlin_ua @  3.11.2011,  14:10 Найти цитируемый пост)
Что это: указатель на указатель? 

Цитата(Merlin_ua @  3.11.2011,  16:28 Найти цитируемый пост)
Я думал, что ответ будет простым и однозначным

да, это указатель на указатель. все просто и ясно)))

Добавлено через 1 минуту и 9 секунд
вспомнив, что указатель хранит адрес, получится что это переменная, которая хранит адрес указателя
PM MAIL   Вверх
Merlin_ua
Дата 3.11.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот собственно код:
Код

// primer.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
using namespace std;


class IX
{
public:
    virtual void Fx() = 0;
};
class IY
{
public:
    virtual void Fy() = 0;
};
class IZ
{
public:
    virtual void Fz() = 0;
};

class CA : public IX, public IY, public IZ
{
public:
    virtual void Fx(){cout << "CA: Fx()\n";}
    virtual void Fy(){cout << "CA: Fy()\n";}
    virtual void Fz(){cout << "CA: Fzzzzz()\n";}
    void ReturnPointer(int a, void** p);
};
void CA::ReturnPointer(int a, void** p)
{
    *p = 0;
    if (a == 1)
        *p = static_cast<IX*>(this);
    else
        if (a == 2)
            *p = static_cast<IY*>(this);
        else { static_cast<IZ*>(this)->Fz(); *p=0;}


}

int _tmain(int argc, _TCHAR* argv[])
{
    CA* pCA = new  CA;
    
    IX* pIX = 0;
    pCA->ReturnPointer(1,(void**)&pIX);
    pIX->Fx();

    IY* pIY = 0;
    pCA->ReturnPointer(2,(void**)&pIY);
    pIY->Fy();

    pCA->ReturnPointer(3,(void**)&pIY);

    return 0;
}



baldina, просто и понятно. Спасибо.

baldina, 
Цитата

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


А может ли эта переменная иметь тип, отличный от void ?
PM MAIL   Вверх
mes
Дата 3.11.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Merlin_ua @  3.11.2011,  17:07 Найти цитируемый пост)
А может ли эта переменная иметь тип, отличный от void ? 

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




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


Эксперт
****


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

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



есть указатель на неизвестный (или произвольный) тип, void*
есть указатели на конкретные типы int*, char* и т.д.
конечно, может быть указатель на указатель какого-либо конкретного типа, например int**

Цитата(Merlin_ua @  3.11.2011,  18:07 Найти цитируемый пост)
может ли эта переменная иметь тип, отличный от void

только это не переменная типа void (такого не бывает), а специальный указатель
PM MAIL   Вверх
math64
Дата 3.11.2011, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Потенциально опасный код.
Код

CA* pCA = new  CA;
    //безопасная замена вызова ReturnPointer простым присвоением указателя
    IX* pIX = pCA; //происходит конвертация указателя CA* в IX*
    pIX->Fx();

    IY* pIY = pCA;
    pIY->Fy();
    // А здесь то самое ошибочное присвоение
    pCA->ReturnPointer(3,(void**)&pIY);


PM   Вверх
mes
Дата 4.11.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(math64 @  3.11.2011,  21:36 Найти цитируемый пост)
 простым присвоением указателя

это не всегда возможно, в частности  когда реальные типы еще не известны..

Добавлено через 1 минуту и 43 секунды
Цитата(math64 @  3.11.2011,  21:36 Найти цитируемый пост)
Потенциально опасный код.

пример действительно опасен, ноп я так понимаю это упрощенный для наглядности пример.. 



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


Новичок



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

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



baldina, 
Цитата

только это не переменная типа void (такого не бывает), а специальный указатель 

я не верно выразился.
mes, 
Цитата

пример действительно опасен, ноп я так понимаю это упрощенный для наглядности пример.. 

Да, это упрощенный пример для наглядности.

Всем спасибо! Вопрос закрыт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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