C通过将它们转换为void指针K& R来交换数组中的任何指针

时间:2015-09-28 19:46:13

标签: c pointers

我找到了许多关于此问题的主题,但没有回应阐明我的具体问题。

所以K& R标题为“Pointers to function”的部分讨论了将任何指针的数组转换为void*指针数组,然后将此数组传递给qsort,以便成为能够对一般项目数组进行排序。

qsort使用一个名为swap的函数,该函数交换其中两个void*指针,有效地交换数组中的位置指向的内容。

它通过常见的

实现了这一目标
void* tmp = v[i];
v[i] = v[j];
v[j] = tmp;

这是我的问题。假设传入的v是一个整数指针数组,假设它们是4个字节。在swap中,此数组表示为void*指针数组。当函数v[i] = ...时,它将v的第一个元素的位置偏移i*sizeof(void*),并获取此内存位置中的元素。正确?但是如果sizeof(void*)sizeof(int*)不一样怎么办?然后v[i]将无法获取包含原始int*的整个内存位置,我甚至不敢假设将返回的内容。 那么swap如何解释这一点呢? 提前致谢

1 个答案:

答案 0 :(得分:0)

  

它将v的第一个元素的位置偏移i*sizeof(void*)并获取此内存位置中的元素。正确的吗?

是的,它根据通常的指针算法使用元素的大小来获取索引元素的位置,在本例中为void*

  

但如果sizeof(void*)sizeof(int*)不同,该怎么办?然后v[i]将无法获取包含原始int*的整个内存位置,我甚至不敢假设将返回的内容。

事实上,sizeof(void*)不一定要与sizeof(int*)相同(虽然经常是这样),如果尺寸不一样,迟早你可能会结束未定义的行为。

  

那么交换如何解释呢?

它没有。然而,stdlib的qsort是不同的:

void qsort(void *base, size_t nmemb, size_t size,
       int (*compar)(const void *, const void *));

size参数通过指定每个元素的大小来处理此问题,允许对非指针类型进行排序,并将可以正确转换回原始类型的void指针传递给{{1}功能。

您可以自己编写一个类似的compar(),将元素的大小作为参数接受,计算正确的位置,然后使用swap()进行交换。