现在的位置: 首页 > 综合 > 正文

支持泛型的C语言Swap函数

2017年10月03日 ⁄ 综合 ⁄ 共 856字 ⁄ 字号 评论关闭

大家都知道C++相对于C有一个很大的提升就是C++支持泛型操作,即同一个函数适用于对很多不同的对象类型。那么在C语言中也是可以实现这种操作的,具体怎么实现的呢,下面以Swap函数为例来说说是怎么实现的。

先来看看普通的Swap函数:

void Swap(int* ap, int* bp)
{
    int temp = *ap;
    *ap = *bp;
    *bp = temp;
}

该函数的两个形参是指向int的指针,那么该函数也只能交换两个int型对象,即在内存中交换2个4字节的布局,如果想要交换任意大小的布局(如double或short)就得重新实现该函数。下面介绍另一种Swap函数的实现,该实现可以支持任意布局大小的内存块的交换。

void Swap(void* vp1, void* vp2, int size)
{
    void* p = (void*)malloc(size);
    assert(p != NULL);
    
    memcpy(p, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, p, size);

    free(p);
}

大家看看该函数的形参不再是指向某一个特定对象的指针,而是指向void对象的指针,我们是要交换vp1和vp2所指向的内容,那么该函数却不知道该内容的具体大小,因为我们只传入了这两个内存块的地址,所以增加了第三个形参size,该形参表明了所要交换的内存块的大小。这样在实现的过程中只要动态申请一个空间,然后在调用内存拷贝函数memcpy就行了,只是不要忘了free申请的空间。

下面看看如何调用泛型Swap函数:

    double c = 2.2;
    double d = 3.3;
    Swap(&c, &d, sizeof(double));

这样调用后,c和d的值就互换了。注意,为了支持跨平台,我们的在传入第三个实参时用了sizeof函数,因为在不同的平台或机器下double不一定都是8字节的。

注意该函数不支持两个长度不一样的两个对象,虽然在某些特殊情况下也可以正确交换,但这也是特殊情况。

后面我会写一篇如何通过这种方法如何实现一个支持泛型的C语言栈。

抱歉!评论已关闭.