我有类似的“通用”过程,如 qsort,它有一个 void 指针(指向一个数组)和一个函数指针参数。这个函数应该适用于任何类型的数组。
例子:
void do_something(void * array, int count, int size, void (*test)(const void*)){
int i;
for(i=0; i<count; i++){
test(array + (index * size));
}
}
然而,这给了我以下警告(gcc test.c -pedantic-errors):
error: pointer of type ‘void *’ used in arithmetic [-Wpedantic]
经过一些研究,我发现使用这样的 void 指针是一种不好的做法。(例如C 中 void 指针的指针算法)
那么标准库是如何为 qsort 做这种事情的呢?查看此代码:(http://aturing.umcs.maine.edu/~sudarshan.chawathe/200801/capstone/n/qsort.c),我看到以下内容:
void
_quicksort (void *const pbase, size_t total_elems, size_t size,
__compar_fn_t cmp)
{
register char *base_ptr = (char *) pbase;
....
char *lo = base_ptr;
char *hi = &lo[size * (total_elems - 1)];
...
}
无论实际类型如何,他们都转换为 (char *) 吗?