6

我开始学习 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**。有人可以用一些例子来解释吗?

4

4 回答 4

4

void** 是指向 void 的指针(未指定类型)。这意味着变量(内存位置)包含一个内存位置的地址,它包含另一个内存位置的地址,并且没有指定存储在那里的内容。在这个问题的情况下,它是一个指向 void* 指针数组的指针。

旁注:不能取消引用 void 指针,但 void** 可以。

void *a[100];
void **aa = a;

通过这样做,应该能够执行例如 aa[17] 以获取数组 a 的第 18 个元素。

要了解此类声明,您可以使用工具,还不如检查一两个相关问题

于 2012-07-12T19:59:23.257 回答
1

void**是指向 的指针,如果您愿意void*,也可以是指向pointera的指针void pointer!例如,这种符号传统上用于C实现矩阵。因此,在矩阵情况下,这将是 apointer到 a array of pointers

于 2012-07-12T01:54:00.160 回答
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

于 2012-07-12T01:59:04.287 回答
0

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;
}
于 2012-07-29T07:57:20.897 回答