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

c中是否有任何逻辑可以交换任何类型的两个变量。 即int,float,字符序列。

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

让我们看看你如何为两个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; } 

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

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

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