在c中交换任何类型的两个变量

时间:2013-10-08 18:06:31

标签: c pointers swap

c中是否有任何逻辑可以交换任何类型的两个变量。即int,float,character of characters。

我可以想到将每种类型的变量存储为特征序列并将其交换为普通字符串的逻辑,但我不是它的好主意。

2 个答案:

答案 0 :(得分:3)

让我们看看你如何为两个char变量做这件事。你会做这样的事情。

void swap(char* a, char* b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

对于两个int变量:

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

等等。现在,为了迎合任何类型的变量,你很想做:

void swap(void* a, void* b)
{
    // ...
}

但是你需要分配一个参数化大小的空间。因此,您必须首先将该大小作为参数:

void swap(void* a, void* b, size_t s)
{
    // ...
}

...您将使用sizeof表达式作为参数传递。你需要分配所述空间并使用它来完成任务(副本)。我想起了malloc / freememcpy,这是一种粗略的方式来完成我们上面针对charint所做的工作,但这次使用参数化大小,将是:

void swap_any(void* a, void* b, size_t s){
    void* tmp = malloc(s);
    memcpy(tmp, a, s);
    memcpy(a, b, s);
    memcpy(b, tmp, s);
    free(tmp);
}

正如我所描述的,这有点粗糙。您可以尝试使用alloca(在堆栈上分配)而不是free

或者,您可以使用宏来执行此操作,因为您可以将类型(而不是size_t)传递给宏 - 因为宏基本上使用文本替换。然后,您显然可以按名称创建临时变量类型,如下所示:

#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; } 

显然,如果您不想传递有关所涉及类型的任何信息,您必须更加有创意。

答案 1 :(得分:1)

您可以使用宏,但它不适用于所有内容:

#define SWAP(a,b) { __typeof__(a) temp; temp = a; a = b; b = temp; }