我开始学习C并阅读以下代码:
public void** list_to_array(List* thiz){
int size = list_size(thiz);
void **array = malloc2(sizeof(void *) * size);
int i=0;
list_rewind(thiz);
for(i=0; i<size; i++){
array[i] = list_next(thiz);
}
list_rewind(thiz);
return array;
}
我不明白void**
的含义。有人可以用一些例子解释一下吗?
答案 0 :(得分:4)
void **是指向void(未指定类型)的指针。这意味着变量(内存位置)包含一个内存位置的地址,该地址包含另一个内存位置的地址,并且未指定存储的位置。在这个问题的情况下,它是一个指向void *指针数组的指针。
旁注:无法取消引用void指针,但void **可以。
void *a[100];
void **aa = a;
通过这样做,应该能够做到这一点。 aa [17]得到数组a的第18个元素。
答案 1 :(得分:1)
void**
是指向void*
或pointer
到void pointer
的指针!
例如,这种表示法传统上用于C
来实现矩阵。因此,在矩阵的情况下,pointer
到array of pointers
。
答案 2 :(得分:0)
通常void *
指针用于表示指向未知数据类型的指针。在这种情况下,你的函数返回一个这样的指针数组,因此是双星。
在C中,指针通常用于引用数组。例如,以下任务是完全合法的:
char str1[10];
char *str2 = str1;
现在当使用void时,这意味着你有一个未知类型的变量而不是char。
指向未知数据类型的指针对于编写通用算法很有用。例如。标准C库中的qsort函数定义为:
void qsort ( void * base,
size_t num,
size_t size,
int ( * comparator )
( const void *, const void * ) );
排序算法本身是通用的,但不了解数据的内容。因此,用户必须提供可以处理它的比较器的实现。该算法将使用两个指向要比较的元素的指针调用比较器。这些指针的类型为void *
,因为现在有关于要排序的数据类型的信息。
请查看此主题以获取更多示例 http://forums.fedoraforum.org/showthread.php?t=138213
答案 3 :(得分:0)
void指针用于保存任何数据类型的地址。 void**
表示指向void指针的指针。 Void指针用在我们希望函数应该接收不同类型数据作为函数参数的地方。请查看以下示例
void func_for_int(void *int_arg)
{
int *ptr = (int *)int_arg;
//some code
}
void func_for_char(void *char_arg)
{
char *ptr = (char *)char_arg;
//some code
}
int common_func(void * arg, void (*func)(void *arg))
{
func(arg);
}
int main()
{
int a = 10;
char b = 5;
common_func((void *)&a, func_for_int);
common_func((void *)&b, func_for_char);
return 0;
}