C中的(void**)是什么意思?

xwmevbvl  于 2023-04-29  发布在  其他
关注(0)|答案(6)|浏览(458)

我会查这个,但老实说,我不知道从哪里开始,因为我不知道它叫什么。我见过传递给函数的变量如下:

myFunction((void**)&variable);

这让我很困惑,因为所有这些看起来我都很熟悉;我只是从没见过他们这样组合在一起。
这是什么意思?我是个新手,所以行话越少越好,谢谢!

xam8gpfp

xam8gpfp1#

void*是“指向任何东西的指针”。void **是另一层间接寻址-“指向任何对象的指针”。基本上,当你想让函数返回任何类型的指针时,你就把它传递进去。
&variable获取变量的地址。variable应该已经是某种指针,但它可能不是void *-它可能是,比如int *,所以获取它的地址将导致int **。如果函数接受void **,则需要强制转换为该类型。
(Of当然,它需要实际返回正确类型的对象,否则当调用代码试图以错误的方式使用它时,它将失败。)

l7mqbcuq

l7mqbcuq2#

把它一片一片地拆开。..
myFunction接受一个指向void类型指针的指针(这意味着它可以指向任何东西)。它可能被声明为这样的内容:

myFunction(void **something);

你传入的任何东西都必须有那个类型。所以你取一个指针的地址,用(void**)将它转换成一个空指针。(基本上是剥夺了它指向什么的任何想法-否则编译器可能会抱怨。)
这意味着&variable是一个指针的地址(&做这个)-所以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);
}

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

Address:0x601020 Value:1
Address:0x601024 Value:2

你可以看到myFunction改变了myPointer的值--这是因为它被传递了指针的地址。

z2acfund

z2acfund3#

它是一个指向void指针的转换。
在Windows系统上,像CoCreateInstance()这样的函数经常会出现这种情况。

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

强制转换将指向ISomeInterface指针的指针转换为指向void指针的指针,以便CoCreateInstance()可以将ifaceptr设置为有效值。
由于它是指向void指针的指针,因此该函数可以输出任何类型的指针,具体取决于接口ID(如IID_ISomeInterface)。

wrrgggsh

wrrgggsh4#

它是一个指向一个未指定类型的变量的指针。所有指针的大小相同,所以void*的意思是“指向某个东西的指针,但我不知道它是什么”。void**也可以是未指定类型的二维数组。

vq8itlhq

vq8itlhq5#

这会将&variable转换为void**(即,指向void的指针的指针)。
例如,如果您有以下内容

void myFunction(void** arg);

int* variable;

这将variable的地址(这就是一元-&所做的,它接受地址)传递给myFunction()

jk9hmnmh

jk9hmnmh6#

变量是指向未定义(void)类型的指针。&运算符返回该变量的地址,因此您现在有一个指向某个指针的指针。因此,指针通过引用传递到函数中。该函数可能会有一个副作用,它会改变该指针所引用的内存。换句话说,调用这个函数可能会改变原始指针所引用的内容。

相关问题