c中是否有任何逻辑可以交换任何类型的两个变量。即int,float,字符序列。
我可以想到将每种类型的变量存储为字符序列并像普通字符串一样交换它的逻辑,但我不知道它是个好主意。
让我们看看如何对两个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
/浮现在脑海中,所以一个粗略的方法来做我们上面对free
and所做的事情,但这次使用参数化的大小,将是:memcpy
char
int
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
.
或者,您可以使用宏来执行此操作,因为您可以将类型(而不是 a size_t
)传递给宏 - 因为宏本质上是使用文本替换来工作的。然后,您显然可以按名称创建临时变量类型,如下所示:
#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; }
显然,如果您根本不想传递有关所涉及类型的任何信息,则您必须对此更具创造性。
您可以为此使用宏,但它不适用于所有内容:
#define SWAP(a,b) { __typeof__(a) temp; temp = a; a = b; b = temp; }