[英]What does (void**) mean in C?
我会仔细研究,但说实话,我不知道从哪里开始,因为我不知道它叫什么。 我已经看到传递给这样的函数的变量:
myFunction((void**)&variable);
这让我感到困惑,因为所有这些对我来说都很熟悉; 我以前从未见过他们像以前那样放在一起。
这是什么意思? 我是一个新手,所以行话越少越好,谢谢!
void*
是“指向任何东西的指针”。 void **
是另一个间接层 - “指向任何东西的指针”。 基本上,当你想让函数返回任何类型的指针时,你会传入它。
&variable
取&variable
的地址。 variable
应该已经是某种指针才能工作,但它可能不是void *
- 它可能是,比如int *
,所以取其地址会产生一个int **
。 如果函数采用void **
则需要转换为该类型。
(当然,它需要实际返回一个正确类型的对象,否则调用代码会在尝试以错误的方式使用它时失败。)
它是指向void
指针的指针。
您经常使用Windows系统上的CoCreateInstance()
等函数来查看。
ISomeInterface* ifaceptr = 0;
HRESULT hr = ::CoCreateInstance(CLSID_SomeImplementation, NULL, CLSCTX_ALL,
IID_ISomeInterface, (void**)&ifaceptr);
if(SUCCEEDED(hr))
{
ifaceptr->DoSomething();
}
ISomeInterface
转换将指向ISomeInterface
指针的指针转换为指向void
指针的指针,以便CoCreateInstance()
可以将ifaceptr
设置为有效值。
由于它是指向void
指针的指针,因此该函数可以输出任何类型的指针,具体取决于接口ID(例如IID_ISomeInterface)。
它是指向具有未指定类型的变量的指针。 所有指针都是相同的大小,所以void*
只是意味着“指向某个东西的指针,但我不知道它是什么”。 void**
也可以是未指定类型的2D数组。
把它分开一块一块......
myFunction获取一个指向void类型指针的指针(这几乎意味着它可以指向任何东西)。 可能会声明如下:
myFunction(void **something);
你传递的任何东西都必须有这种类型。 因此,您获取指针的地址,并使用(void **)将其转换为使其成为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);
}
如果你编译并运行它,它应该给出这种输出:
Address:0x601020 Value:1
Address:0x601024 Value:2
你可以看到myFunction改变了myPointer的值 - 它只能这样做,因为它传递了指针的地址。
这会将&variable
转换为void**
(即指向void
的指针)。
例如,如果您有某些内容
void myFunction(void** arg);
int* variable;
这会将variable
的地址(这是一元&
并且执行,它需要地址)传递给myFunction()
。
变量是指向未定义(void)类型的指针。 &运算符返回该变量的地址,因此您现在有一个指向某事物指针的指针。 因此,指针通过引用传递给函数。 该函数可能具有副作用,该副作用会更改该指针引用的内存。 换句话说,调用此函数可能会更改原始指针引用的内容。
#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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.