【问题标题】:How to understand type cast for pointer arrays?如何理解指针数组的类型转换?
【发布时间】: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 同名?

标签: c arrays pointers casting


【解决方案1】:

您不能将数组指针void* lineptr[] 转换为void**,它们不是兼容的类型。但是qsort 需要一个指向第一个元素的指针void*,所以无论如何这都不正确。

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

在回调中,每个void* 实际上都会指向char* 的地址,所以你可能需要做一些看起来很奇怪的事情,比如char* ptr = *(char**)param;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2020-06-15
    • 2014-08-14
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多