<分区>
C 语言中是否存在可以交换任何类型的两个变量的逻辑。即 int、float、字符序列。
我可以想到将每种类型的变量存储为字符序列并像普通字符串一样交换它的逻辑,但我认为这不是个好主意。
<分区>
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
和 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
。
或者,您可以使用宏来完成此操作,因为您可以将 type(而不是 size_t
)传递给宏 - 因为宏本质上使用文本替换来工作.然后,您显然可以按名称创建临时变量类型,如下所示:
#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; }
显然,如果您根本不想传递有关所涉及类型的任何信息,您就必须对此更有创意。
关于c - 在c中交换任何类型的两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255069/