【问题标题】:What does the declaration void** mean in the C language?声明 void** 在 C 语言中是什么意思?
【发布时间】:2012-07-11 17:48:55
【问题描述】:

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

【问题讨论】:

  • void** = 指向void*的指针
  • 在这种情况下,它的意思是“指向 void* 指针数组的指针”
  • @VariableLengthCoder,不应该是void* (*array)[]。您的意思可能是“指向void 指针数组的第一个元素的指针”。
  • @mlzboy 考虑通过接受您满意的答案来结束这个问题。

标签: c arrays pointers declaration void-pointers


【解决方案1】:

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

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

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

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

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

【讨论】:

  • Answer 不是独立的 - 如果当这些链接断开时,它的值将为零。
  • @dwanderson 嘿,谢谢。我已经更新了答案。 2012 年我写这个答案时一定有点懒惰。我的错。 :)
  • 令人印象深刻的跟进!当人们回答多年前的问题时,总是很感激。谢谢!
【解决方案2】:

void** 是一个指向void* 的指针,或者如果你愿意的话,一个pointer 是一个指向void pointer 的指针! 例如,这种表示法传统上在C 中用于实现矩阵。因此,在矩阵情况下,这将是 pointerarray of pointers

【讨论】:

  • 这是一个指向void 指针的指针,但什么是指向void 指针的void 指针?
  • @CarlNorum 对于任何错误的输入,我深表歉意。
【解决方案3】:

通常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

【讨论】:

  • -1 表示char **strarray2 = strarray1; 是“完全合法的”。
  • Jens 是对的,char[][] 等价于 char[](它只是方便编译器为您执行二维数组指针运算的语法),而 char** 是指向字符数组。
  • 感谢您指出这一点,当我回答它以纠正我时,我手头没有 C 编译器:(
【解决方案4】:

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;
}

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2012-03-11
    • 2013-03-09
    • 2011-08-27
    • 2011-01-14
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多