我正在阅读一个程序,发现了这个函数:
我的问题是我可以给什么样的参数,我的返回值应该是什么?
*更新!!!*
我能读懂它,我知道它可以是任何类型的指针,问题是如何使用它?(我刚刚编辑了标题) 谢谢!
void** function(void**)
我的问题是我可以给什么样的参数,我的返回值应该是什么?
*更新!!!*
我能读懂它,我知道它可以是任何类型的指针,问题是如何使用它?(我刚刚编辑了标题) 谢谢!
函数声明:
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;
}
这是一个接受指向指针的指针的函数,返回指向指针的指针。
你可以像这样使用它:
int something = 5;
void* somepointer = &something;
functionName(&somepointer);
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);
void**
并返回一个void**
。你还想听什么? - Christian Rau