使用空指针交换函数

Con*_*nor 0 c swap void-pointers

我想做一个交换函数,可以通用地用于任何数据类型。我知道以下函数适用于int:

void swap(void *a, void *b)
{
    int temp;
    temp = *(int*)a;
    *(int*)a = *(int*)b;
    *(int*)b = temp;
}
Run Code Online (Sandbox Code Playgroud)

这适用于字符串:

void swap(void *a, void *b)
{
    void *temp;
    temp = *(void**)a;
    *(void**)a = *(void**)b;
    *(void**)b = temp;
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

如果您也传递了pointee的大小(如中的qsort),则可以这样做:

void swap(void * a, void * b, size_t len)
{
    unsigned char * p = a, * q = b, tmp;
    for (size_t i = 0; i != len; ++i)
    {
        tmp = p[i];
        p[i] = q[i];
        q[i] = tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

struct Qux x, y;
swap(&x, &y, sizeof(Qux));
Run Code Online (Sandbox Code Playgroud)

(您可能希望将restrict限定符添加到指针,或者以其他方式进行自交换测试。)

  • @chqrlie:请在获得最佳解决方案后发布它! (2认同)