Что такое void ** в C #?

Я просматриваю исходный код программы C #, которая использует библиотеку, написанную на C. Я наткнулся на эту строку и не был уверен, что это было:

cvbimUNSAFE.GetImageVPA ((cvbim.IMG)cvImg.Image, 0, (void**)&lpImageBits, &pVPAT);

Что такое объект типа void **? Я провел несколько поисков в Google и смог найти информацию только о void*, который, если я правильно понял, является указателем на своего рода отлов всех типов верхнего уровня.


person user12345613    schedule 26.08.2011    source источник
comment
Я знаю, что это происходит немного поздно, но в качестве побочного примечания: объявление параметра как void** также является эквивалентом C передачи void* по ссылке или как выходной параметр (void*&), и это фактически то, что делает функция GetImageVPA (я случайно знать библиотеку ...). Таким образом, в операторе DllImport для GetImageVPA безопаснее всего писать out IntPtr или out void* (последнее требует спецификации unsafe).   -  person StuporMundi    schedule 07.06.2017


Ответы (6)


Это указатель на указатель на что-то не указанное. По сути, просто думайте об этом как об указателе памяти на необработанный указатель памяти.

Итак, int** - указатель на указатель на int, но void** - указатель на указатель, но не указано, на что указывает этот указатель.

Я сделал несколько поисков в Google и смог найти информацию только о void *, которая является указателем на своего рода catch all top level type, если я правильно понял.

Не совсем. void* - это указатель на что-то, просто он не указывает, что это что-то такое, и его следует рассматривать как указатель на необработанный кусок памяти, к которому вы должны применить некоторую структуру. Например, malloc возвращает void*, потому что он возвращает указатель на необработанный кусок памяти.

person jason    schedule 26.08.2011

Это пустой указатель. Подробнее см. В этой статье:

http://msdn.microsoft.com/en-us/library/y31yhkeb%28VS.80%29.aspx

И вы можете взглянуть на этот вопрос SO для получения подробной информации о том, как реализовать его на C #:

Как объявить указатель void в C #

Кстати, этот метод следует пометить как небезопасный, если это не так.

person James Johnson    schedule 26.08.2011

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

person Vinicius Kamakura    schedule 26.08.2011

В C он представляет собой указатель на объект void*. Другими словами, при разыменовании вы получите void*.

Я предполагаю, что это используется, потому что lpImageBits будет изменен внутри функции, которую вы вызываете.

person Simone    schedule 26.08.2011

В C # void** - это указатель на void* указатель. Вот простой пример:

   public unsafe static void Main(string[] args)
   {
        int x = 1;
        void* v = &x;

        //dereferencing v, it prints 1
        Console.WriteLine(*(int*)v);

        void** vtp = &v;
        //dereferencing vtp, it prints 1
        Console.WriteLine(*(int*)*vtp);

        Console.ReadLine();
    }
person V. S.    schedule 16.10.2020

Это не C #. Похоже на C ++. В этом случае void** - это указатель на пустой указатель.

person Jez    schedule 26.08.2011
comment
Это c #, который использует c dll - person user12345613; 26.08.2011