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

标签 c pointers swap

<分区>

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/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

或者,您可以使用宏来完成此操作,因为您可以将 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/

相关文章:

c - 实例化结构并分配字符串但字符串打印空行?

c - 冒泡排序链表,交换指针。 C

c - 需要将内存对齐到 2 的幂,并将程序中断对齐到 2 * getpagesize() 的倍数(C 中)

c - Do while 循环给出意外的输出

c - 如何向另一台电脑发送通知?

c# - float* 从 C 到 C#

C 程序怪异行为——指针和内存

c++ - 如何在类中创建和使用指向未知数量结构数组的指针?

c++ - 在 C++ 中使用 4 个交换函数修复程序

c++ - 如果我在整个类上使用 std::swap,是否会使用专门的 shared_ptr::swap() 函数?