宣言无效**在C语言中意味着什么?

时间:2012-07-12 01:49:40

标签: c arrays pointers declaration void-pointers

我开始学习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 个答案:

答案 0 :(得分:4)

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

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

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

通过这样做,应该能够做到这一点。 aa [17]得到数组a的第18个元素。

要理解此类声明,您可以使用this工具,也可以查看相关的questiontwo

答案 1 :(得分:1)

如果您愿意,

void**是指向void*pointervoid pointer的指针! 例如,这种表示法传统上用于C来实现矩阵。因此,在矩阵的情况下,pointerarray 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;
}