如何理解指针数组的类型转换?

时间:2019-05-16 09:27:44

标签: c arrays pointers casting

我正在阅读《 The C Programming Language》,第二版。我对指针数组的类型转换有些困惑。原始完整代码可在here中找到。

char *lineptr[100];
void qsort(void *lineptr[], int left, int right, int (*comp)(void *, void *));
main()
{
    //some code are omitted

    //usage 1, original code in the book
    qsort((void **) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ?numcmp : strcmp));

    //usage 2, my understanding
    qsort((void *) lineptr, 0, nlines-1, (int (*)(void*,void*))(numeric ?numcmp : strcmp));
}

作者说:“任何指针都可以强制转换为void *并再次返回而不会丢失信息,因此我们可以通过将参数强制转换为qsort来调用void *。” (第5.11章)

我已经测试了用法1和用法2都可以成功运行。我知道用法1应该是正确的,但是用法2呢?我认为用法2应该正确将lineptr强制转换为void *。在这种情况下,(void **) lineptr(void *) lineptr有什么区别?

1 个答案:

答案 0 :(得分:0)

您不能将数组指针void* lineptr[]转换为void**,因为它们不是兼容类型。但是qsort期望有指向第一个元素的指针void*,所以这是不正确的。

给出char *lineptr[100];,然后在C语言中,只需按原样将lineptr传递给qsort,而无需强制转换。

在回调中,每个void*实际上都指向一个char*的地址,因此您可能不得不做一些看起来很奇怪的事情,例如char* ptr = *(char**)param;

在C ++中,您应该改用std::sort