如何使用void** function(void**)?

3
我正在阅读一个程序,发现了这个函数:
void** function(void**) 

我的问题是我可以给什么样的参数,我的返回值应该是什么?
*更新!!!*
我能读懂它,我知道它可以是任何类型的指针,问题是如何使用它?(我刚刚编辑了标题) 谢谢!

一个指向void指针的指针? - jrok
它返回一个指向void指针的指针。 - Mats Petersson
是的,但我该如何使用它? - Engine
2
泛型链表,泛型二叉树,泛型哈希表 - Yavar
这取决于这个特定函数的作用。从问题中我们只能知道它接受一个 void** 并返回一个 void**。你还想听什么? - Christian Rau
3个回答

7

函数声明:

void **functionName( void**);

...被解读为:“functionName是一个传入双重void指针并返回双重void指针的函数”。它接收一个双重void指针并返回一个双重void指针。

在泛型ADT、比较函数、销毁函数等中,看到void指针是非常普遍的。(OP的评论中提到了这个重要细节,但没有具体说明)。

示例(无意义的函数):

把这个数组看作你的数组。假设你想将第一个元素改为字符串“Hai”,而不是“Hello”(太经典了)。

char *arr_of_str[] = { "Hello", "Hi", "Hey", "Howdy" };

那么您的函数应该如下所示:
void **functionName( void** ptr ) {
  char **ptr_char = ptr;

  ( *ptr_char )[ 0 ] = "Hai";

  return ptr;
}

4

这是一个接受指向指针的指针的函数,返回指向指针的指针。

你可以像这样使用它:

int something = 5;
void* somepointer = &something;

functionName(&somepointer);

1

void *可以指向任何类型的地址。您可以将其解读为:“指向内存中某个东西的指针”。这意味着它可以指向整数、字符串、对象等所有内容。以下是一些示例:

void *anyObject;
int a = 1;
float b = 2;
char *c = "somestring";

function aFunction(int a)
{
   ...
}

anyObject = &a;
anyObject = &b;
anyObject = &c;
anyObject = &aFunction;

以下都是有效赋值。

回到你的问题:一个void **是指向指针的指针,正确的说法是:它指向内存中存储void *值的位置。 从上面的例子继续:

void **p;
p = &anyObject;

一般来说,void * 是危险的,因为它们不具备类型安全性。为了使用它们,必须将它们强制转换为已知类型。如果将它们转换为非法类型,编译器将不会发出警告。
好的,如何使用它呢?这很难回答,因为我们无法从声明中推导出期望的类型。同时,这个函数可能会在函数内部分配内存,并将其返回到参数中。但是,总的原则是:取 '指向某物的指针' 的地址(&),然后将其传递给函数。
int a = 0;
int *pa = &a;
functionName(&pa);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接