我正在读一个程序,我发现了这个功能:
void** function(void**)
我的问题是我可以提供什么样的参数以及我的返回值应该是什么?
* UPDATE !!! *
我可以阅读它,我知道它可以是任何类型的指针指针,问题是如何使用它? (我刚刚编辑了标题) 提前致谢 !
答案 0 :(得分:7)
函数声明:
void **functionName( void**);
...读作:“functionName
是一个传递双空指针并返回双空指针”的函数。它传递一个双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;
}
答案 1 :(得分:4)
这是一个函数,它指向指向void
的指针,并返回指向void
的指针。
您可以像这样使用它:
int something = 5;
void* somepointer = &something;
functionName(&somepointer);
答案 2 :(得分: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 *
值的位置。
继续上面的例子:
void **p;
p = &anyObject;
通常,void *
是危险的,因为它们不是类型安全的。为了使用它们,你必须将它们转换为已知类型。如果你把它变成非法的东西,编译器就不会抱怨。
好的,你怎么用它?嗯,这很难回答,因为我们无法从声明中得出预期的类型。此外,此函数可能会在函数内部分配内存并在参数内返回。 但是,一般原则是:取'指向某事物的指针'的地址(&),并将其传递给函数。
int a = 0;
int *pa = &a;
functionName(&pa);