(void**)在C中的含义是什么?

num*_*l25 6 c c++

我会仔细研究,但说实话,我不知道从哪里开始,因为我不知道它叫什么.我已经看到传递给这样的函数的变量:

myFunction((void**)&variable);
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为所有这些对我来说都很熟悉; 我以前从未见过他们像以前那样放在一起.

这是什么意思?我是一个新手,所以行话越少越好,谢谢!

EMP*_*EMP 9

void*是一个"指向任何东西的指针".void **是另一个间接层 - "指向任何东西的指针".基本上,当你想让函数返回任何类型的指针时,你会传入它.

&variable获取变量的地址.variable应该已经成为某种指针,但它可能不是void *- 它可能是int *,所以取其地址会导致a int **.如果该函数需要,void **则需要转换为该类型.

(当然,它需要实际返回一个正确类型的对象,否则调用代码会在尝试以错误的方式使用它时失败.)


Kim*_*ece 6

一块一块地拆开...

myFunction 接受一个指向 void 类型指针的指针(这几乎意味着它可以指向任何东西)。它可能被声明为这样的:

myFunction(void **something);
Run Code Online (Sandbox Code Playgroud)

您传入的任何内容都必须具有该类型。所以你取一个指针的地址,并用 (void**) 将它转换成一个空指针。(基本上剥夺了它指向什么的任何想法 - 否则编译器可能会抱怨。)

这意味着 &variable 是指针的地址(& 这样做) - 所以变量是一个指针。要什么?谁知道!

这是一个更完整的片段,以了解如何将其组合在一起:

#include <stdio.h>

int myInteger = 1;
int myOtherInt = 2;
int *myPointer = &myInteger;

myFunction(void **something){
    *something = &myOtherInt;
}

main(){
    printf("Address:%p Value:%d\n", myPointer, *myPointer);
    myFunction((void**)&myPointer);
    printf("Address:%p Value:%d\n", myPointer, *myPointer);
}
Run Code Online (Sandbox Code Playgroud)

如果你编译并运行它,它应该给出这样的输出:

Address:0x601020 Value:1
Address:0x601024 Value:2
Run Code Online (Sandbox Code Playgroud)

您可以看到 myFunction 更改了 myPointer 的值 - 它只能这样做,因为它传递了指针的地址。


In *_*ico 5

它是一个指向指针的void指针的强制转换。

您经常会CoCreateInstance()在 Windows 系统上的功能中看到这一点。

ISomeInterface* ifaceptr = 0;
HRESULT hr = ::CoCreateInstance(CLSID_SomeImplementation, NULL, CLSCTX_ALL,
    IID_ISomeInterface, (void**)&ifaceptr);
if(SUCCEEDED(hr))
{
    ifaceptr->DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

强制转换将指向指针的ISomeInterface指针转换为指向指针的void指针,以便CoCreateInstance()可以设置ifaceptr为有效值。

由于是指向指针的void指针,因此函数可以输出任何类型的指针,具体取决于接口 ID(例如 IID_ISomeInterface)。