2015-09-28 89 views
-1

我发现了很多关于此的线程,但没有解释我的具体问题。C通过将数组中的指针强制转换为void指针K&R

所以ķ&的R题为“指针的功能”有关开启任何指针数组成void*指针的数组,然后使此数组qsort会谈,为了在部以能够进行排序的一个通用的排列项目。

qsort使用称为swap的函数,它交换指针中的两个指针,有效地交换数组中位置将指向的位置。

它通过公共

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

请小心。交换指针的内容与交换它们指向的对象**的内容非常不同。 – Olaf

+0

“,假设这些是4个字节”你应该已经不再考虑这个了。你看起来会尝试导致不可维护的代码。 – Olaf

+0

它交换指针本身,而不是指针指向的数据 – rlbond

回答

0

它通过i*sizeof(void*)抵消的v第一元件的位置和获得了所述元素在该存储器中的位置。正确?

是的,它根据通常的使用元素大小的指针算术得到索引元素的位置,在这个例子中是void*

但是如果sizeof(void*)sizeof(int*)不一样?然后v[i]将不会得到包含原始int*的整个内存位置,我甚至会假设将返回什么。

事实上,sizeof(void*)是不是相同的sizeof(int*)(虽然它经常是)必须的,如果尺寸是不一样的,迟早你很可能会与不确定的行为而告终。

那么swap如何解释呢?

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

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

size参数通过指定每个元素有多大,允许非指针类型的两种分类,并通过空指针可以正确转换回处理这一问题原始类型为compar()函数。

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

+0

非常感谢Iskar。这只是清理了一切。 – user96454