5

我正在查看一个用 C++ 编写的 API,但我对以下参数类型的含义感到困惑:

void*& data

这是否意味着用户会传入对 void 指针的引用?如果这是真的,那有什么意义呢?我的意思是 void* 已经间接了,那么你为什么还要重新重定向它呢?

4

3 回答 3

7

void *在 C++ 中表示 pass-by-pointer,意思是你传入一个指针,但它实际上是指针的副本。如果您在函数中修改了此指针,例如更改其地址,则它不会反映在您传入的指针中。

将其与按引用传递相结合,void *&意味着您将原始指针的别名传递给此函数。如果你修改了它,就像改变它的地址一样,它会反映在原来的指针上。

于 2010-11-20T19:59:26.510 回答
2

很难说没有看到它的用途,但是您指出引用是间接级别。如果它是指向指针的指针,你会觉得奇怪吗?这些是很常见的——事实上,你在接受命令行参数并获取指向 char 指针的指针时会处理它们。另一个示例是,如果您正在使用存储桶制作哈希映射,并且希望能够将指针返回到启动存储桶的指针。

关键是有时您需要多个间接级别。确实,混合指针和引用可能很奇怪,但这是有充分理由的。一个常见的原因是需要 C++ 代码与 C api 交互。许多 POSIX 系统调用需要传入然后更改的 void 指针,因此有问题的 C++ 函数可能充当围绕它的包装器。

于 2010-11-20T20:03:17.823 回答
1

但请注意不要返回对本地 void* 的引用。不要做这样的事情:

void*& f()
{
 int* a=new int(10);
 void* x=(void*)a;
 return x;
}
于 2010-11-20T20:05:03.393 回答