Что такое пустота ** в C #? - PullRequest
9 голосов
/ 26 августа 2011

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

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

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

Ответы [ 5 ]

18 голосов
/ 26 августа 2011

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

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

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

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

2 голосов
/ 26 августа 2011

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

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

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

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

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

1 голос
/ 26 августа 2011

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

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

1 голос
/ 26 августа 2011

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

0 голосов
/ 26 августа 2011

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

...