交换的任何类型的两个变量的在C [复制](Swap any type of two variable

2019-10-18 17:41发布

这个问题已经在这里有一个答案:

  • 实现通用互换宏C [复制] 6个回答

有没有在C可以交换任何类型的两个变量的任何逻辑。 即整数,浮点,字符的序列。

我能想到的每一个存储类型的变量作为characte的序列的逻辑和交换它像正常的字符串,但我没有它的好主意。

Answer 1:

让我们来看看你怎么了两个做这个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; } 

显然,如果你不希望任何信息在所有涉及的种类通过,你必须更有创意了。



Answer 2:

您可以使用宏为,但它不会一切工作:

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


文章来源: Swap any type of two variables in c [duplicate]
标签: c pointers swap