以下代码片段来自K&R第5-11章:指向函数的指针:
qsort((void**) lineptr, 0, nlines-1,
(int (*)(void *, void *)(numeric ? numcmp : strcmp));
我能够用(void*)
编译/运行代码,那么为什么lineptr使用(void **)
进行强制转换呢?这两种类型之间是否有任何内部差异,还是更容易阅读?(void *)
转换只是数组,而(void **)
是同时转换数组和存储指针吗?
据我所知,**lineptr
等同于*lineptr[]
,而产生void的原因是为了让编译器高兴。
发布于 2014-12-26 20:58:01
很可能是不正确的。
空*是指向某物的指针。我们不知道它指向什么。您可以将任何指针转换为空*。传递给qsort的比较函数必须猜测void*指向的实际类型。如果它是对的,很好。如果它弄错了,事情就会出错--这是生命和程序员的责任。
空**是指向空*数组的指针。这里有一个很大的区别:例如,您可以将int*转换为void*,但是int*数组绝对不是一个void*数组。int*和void*可以有不同的大小!C标准非常清楚地说明了哪种指针具有相同的表示形式:
任何不在同一组中的指针都可能有不同的表示形式,因此强制转换可能有效,但是memcpy或通过指针读取指向不同指针类型的值不起作用。
https://stackoverflow.com/questions/27661807
复制相似问题