我正在阅读《 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
有什么区别?
答案 0 :(得分:0)
您不能将数组指针void* lineptr[]
转换为void**
,因为它们不是兼容类型。但是qsort
期望有指向第一个元素的指针void*
,所以这是不正确的。
给出char *lineptr[100];
,然后在C语言中,只需按原样将lineptr
传递给qsort
,而无需强制转换。
在回调中,每个void*
实际上都指向一个char*
的地址,因此您可能不得不做一些看起来很奇怪的事情,例如char* ptr = *(char**)param;
。
在C ++中,您应该改用std::sort
。