What is void** in C#?

前端 未结 6 1151
失恋的感觉
失恋的感觉 2021-01-12 01:42

I\'m looking through the source of a C# program that uses a library written in C. I came across this line and was unsure what it was:

cvbimUNSAFE.GetImageVPA         


        
相关标签:
6条回答
  • 2021-01-12 02:11

    It's a void pointer. See this article for details:

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

    And you can take a look at this SO question for details on how to implement it in C#:

    How to declare a void pointer in C#

    On a side note, that method should be marked as unsafe if it's not.

    0 讨论(0)
  • 2021-01-12 02:18

    That's not C#. It looks like C++. In that case, a void** is a pointer to a void pointer.

    0 讨论(0)
  • 2021-01-12 02:20

    In C, it represents a pointer to a void* object. In other word, when you dereference it you get a void*.

    I guess this is used because lpImageBits will be modified inside the function you are invoking.

    0 讨论(0)
  • 2021-01-12 02:25

    It's a pointer to a pointer to something not specified. Basically, just think of it as a memory pointer to a raw memory pointer.

    So, int** is a pointer to a pointer to an int, but void** is a pointer to a pointer, but it's not specified what that pointer is pointing at.

    I did some google searches and could only find information about void*, which is a pointer to a sort of catch all top level type, if I understood correctly.

    Not quite. void* is a pointer to something, it's just not specified what that something is and should just be thought of as a pointer to a raw hunk of memory that you have to apply some structure to. For example, malloc returns a void* because it's returning a pointer to a raw hunk of memory.

    0 讨论(0)
  • 2021-01-12 02:28

    In this case, I am guessing this library will allocate the amount of memory necessary to hold the image so it needs a double indirection so it can change the address lpImageBits points to.

    0 讨论(0)
  • 2021-01-12 02:33

    In C# void** is a pointer to void* pointer. Here is a simple example:

       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();
        }
    
    0 讨论(0)
提交回复
热议问题