【发布时间】:2019-05-16 09:27:44
【问题描述】:
我正在阅读《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 *并再次返回而不会丢失信息,因此我们可以通过将参数转换为void *来调用qsort。” (第 5.11 章)
我测试了用法1和用法2都可以成功运行。我知道用法 1 应该是正确的,但是用法 2 呢?在我看来,用法 2 应该适合将 lineptr 转换为 void *。在这种情况下,(void **) lineptr 和 (void *) lineptr 有什么区别?
【问题讨论】:
-
那不应该在 C++ 中编译。 C 和 C++ 是不同的语言。请只标记您正在使用的那个。
-
void*是特例,与void**无关 -
您的
qsort函数签名看起来很奇怪。您是否有自己的实现恰好与内置的qsort同名?