gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:39:16 25 4
gpt4 key购买 nike

我正在阅读《C 程序设计语言》,第二版。我对指针数组的类型转换有点困惑。原始完整代码可以在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 有什么区别?

最佳答案

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

给定char *lineptr[100]; ,然后在 C 中,只需传递 lineptrqsort按原样,无需类型转换。

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

在 C++ 中,您应该使用 std::sort相反。

关于c - 如何理解指针数组的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56165242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com