答案是肯定的,您可以通过引用传递void*,而您得到的错误与此无关。问题是,如果您有一个通过引用获取void* 的函数,那么您只能将实际上是void*s 的变量作为参数传递。这是有充分理由的。例如,假设你有这个函数:
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction(myIntArray); // Error- this isn't legal!
由于指定的调用,上面的代码是非法的,并且有充分的理由。如果我们可以将myIntArray 传入MyFunction,它将被重新分配为指向void* 类型的缓冲区,该缓冲区不是int 数组。因此,从函数返回时,您的int* 将指向void* 类型的数组,从而颠覆了类型系统。这并不是说 C++ 有一个强大的类型系统——它没有——但如果你要颠覆它,你必须显式地进行一些强制转换。
你同样不能这样做:
void MyFunction(void*& ptr) {
ptr = malloc(137); // Get a block of raw memory
}
int* myIntArray;
MyFunction((void*)myIntArray); // Error- this isn't legal!
作为一个很好的参考,你为什么不能这样做,想想这段代码:
void OtherFunction(int& myInt) {
myInt = 137;
}
double myDouble;
OtherFunction((int)myDouble); // Also error!
这是不合法的,因为如果您尝试将 double 传递给采用 int& 的函数,那么由于 int 和 double 具有根本不同的二进制表示,您最终会破坏double 的位与无意义的数据。如果这个演员阵容是合法的,就有可能做这样的坏事。
简而言之,是的,您可以输入void* &,但如果您这样做,则必须输入真实的void*s。正如 Erik 上面所指出的,如果您想释放指针并将指针模板归零,那么您可以这样做。
如果你真的想将uint_8* 传递给你的函数,你可以这样做:
uint_8* uPtr = /* ... */
void* ptr = uPtr;
FreeAndNull(ptr);
uPtr = (uint_8*) ptr;
这需要显式转换来告诉编译器“是的,我知道这可能不安全,但无论如何我都会这样做。”
希望这会有所帮助!