指向K& R的功能代码

时间:2016-02-23 23:24:29

标签: c pointers

K& R的第119页显示用函数指针编写的qsort:

if ((nlines = readlines(lineptr, MAXLINES)) >= 0)
    qsort((void **) lineptr, 0, nlines -1,
        (int (*)(void *, void *))(numeric ? numcmp : strcmp));

在此代码中,lineptr被强制转换为指向void的指针。它是指向char指针数组的指针。但是代码也可以写成:

    qsort((void *) lineptr, 0, nlines-1, 

它仍然完美运行。编译器是否只是搞清楚了?为什么要以某种方式编写代码?

1 个答案:

答案 0 :(得分:1)

在该声明中,第一个参数的类型为void* lineptr[],相当于void** lineptr

如果您使用

致电
qsort((void *) lineptr, 0, nlines-1);

它仍然有效,因为你可以将void*转换为C中的任何其他指针类型。最好使用完全匹配的类型,但更多的是编码指南而不是语言的要求

可能,因为我不确定,在编写本书时,编译器不支持从void*void**的隐式转换。因此,本书使用(void**)lineptr作为第一个参数。