我会查这个,但老实说,我不知道从哪里开始,因为我不知道它叫什么。我见过传递给函数的变量如下:
myFunction((void**)&variable);
这让我很困惑,因为所有这些看起来我都很熟悉;我只是从没见过他们这样组合在一起。这是什么意思?我是个新手,所以行话越少越好,谢谢!
xam8gpfp1#
void*是“指向任何东西的指针”。void **是另一层间接寻址-“指向任何对象的指针”。基本上,当你想让函数返回任何类型的指针时,你就把它传递进去。&variable获取变量的地址。variable应该已经是某种指针,但它可能不是void *-它可能是,比如int *,所以获取它的地址将导致int **。如果函数接受void **,则需要强制转换为该类型。(Of当然,它需要实际返回正确类型的对象,否则当调用代码试图以错误的方式使用它时,它将失败。)
void*
void **
&variable
variable
void *
int *
int **
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的值--这是因为它被传递了指针的地址。
z2acfund3#
它是一个指向void指针的转换。在Windows系统上,像CoCreateInstance()这样的函数经常会出现这种情况。
void
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)。
ISomeInterface
ifaceptr
wrrgggsh4#
它是一个指向一个未指定类型的变量的指针。所有指针的大小相同,所以void*的意思是“指向某个东西的指针,但我不知道它是什么”。void**也可以是未指定类型的二维数组。
void**
vq8itlhq5#
这会将&variable转换为void**(即,指向void的指针的指针)。例如,如果您有以下内容
void myFunction(void** arg); int* variable;
这将variable的地址(这就是一元-&所做的,它接受地址)传递给myFunction()。
&
myFunction()
jk9hmnmh6#
变量是指向未定义(void)类型的指针。&运算符返回该变量的地址,因此您现在有一个指向某个指针的指针。因此,指针通过引用传递到函数中。该函数可能会有一个副作用,它会改变该指针所引用的内存。换句话说,调用这个函数可能会改变原始指针所引用的内容。
6条答案
按热度按时间xam8gpfp1#
void*
是“指向任何东西的指针”。void **
是另一层间接寻址-“指向任何对象的指针”。基本上,当你想让函数返回任何类型的指针时,你就把它传递进去。&variable
获取变量的地址。variable
应该已经是某种指针,但它可能不是void *
-它可能是,比如int *
,所以获取它的地址将导致int **
。如果函数接受void **
,则需要强制转换为该类型。(Of当然,它需要实际返回正确类型的对象,否则当调用代码试图以错误的方式使用它时,它将失败。)
l7mqbcuq2#
把它一片一片地拆开。..
myFunction接受一个指向void类型指针的指针(这意味着它可以指向任何东西)。它可能被声明为这样的内容:
你传入的任何东西都必须有那个类型。所以你取一个指针的地址,用(void**)将它转换成一个空指针。(基本上是剥夺了它指向什么的任何想法-否则编译器可能会抱怨。)
这意味着&variable是一个指针的地址(&做这个)-所以variable是一个指针。去干什么?谁知道!
下面是一个更完整的片段,以给予这是如何组合在一起的:
如果你编译并运行它,它应该给予这样的输出:
你可以看到myFunction改变了myPointer的值--这是因为它被传递了指针的地址。
z2acfund3#
它是一个指向
void
指针的转换。在Windows系统上,像
CoCreateInstance()
这样的函数经常会出现这种情况。强制转换将指向
ISomeInterface
指针的指针转换为指向void
指针的指针,以便CoCreateInstance()
可以将ifaceptr
设置为有效值。由于它是指向
void
指针的指针,因此该函数可以输出任何类型的指针,具体取决于接口ID(如IID_ISomeInterface)。wrrgggsh4#
它是一个指向一个未指定类型的变量的指针。所有指针的大小相同,所以
void*
的意思是“指向某个东西的指针,但我不知道它是什么”。void**
也可以是未指定类型的二维数组。vq8itlhq5#
这会将
&variable
转换为void**
(即,指向void
的指针的指针)。例如,如果您有以下内容
这将
variable
的地址(这就是一元-&
所做的,它接受地址)传递给myFunction()
。jk9hmnmh6#
变量是指向未定义(void)类型的指针。&运算符返回该变量的地址,因此您现在有一个指向某个指针的指针。因此,指针通过引用传递到函数中。该函数可能会有一个副作用,它会改变该指针所引用的内存。换句话说,调用这个函数可能会改变原始指针所引用的内容。