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

时间:2010-05-31 03:43:12

标签: c++ c

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

myFunction((void**)&variable);

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

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

7 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:4)

它是指向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)。

答案 2 :(得分:3)

它是指向具有未指定类型的变量的指针。所有指针都是相同的大小,因此void*只是意味着“指向某个东西,但我不知道它是什么”。 void**也可以是未指定类型的2D数组。

答案 3 :(得分:3)

将它一块一块地分开......

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

myFunction(void **something);

您传入的任何内容都必须具有该类型。因此,您获取指针的地址,并使用(void **)将其转换为使其成为void指针。 (基本上剥夺了它所指出的任何想法 - 编译器可能会抱怨其他情况。)

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

这是一个更完整的代码段,用于了解这是如何组合在一起的:

#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的值 - 它只能这样做,因为它传递了指针的地址。

答案 4 :(得分:1)

&variable强制转换为void**(即指向void的指针)。

例如,如果您有某些内容

void myFunction(void** arg);

int* variable;

这会将variable的地址(这是一元 - &所做的,它需要地址)传递给myFunction()

答案 5 :(得分:0)

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

答案 6 :(得分:0)

#include <stdio.h>
#include <iostream>

int myInteger = 1;
std::string myOtherInt = "Test";
int *myPointer = &myInteger;

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

int main(){
    //printf("%d\n", *myPointer);
    printf("Address:%p Value:%d\n", myPointer, *myPointer);
    myFunction((void**)&myPointer);
    printf("Address:%p Value:%d\n", myPointer, *myPointer);
}