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
/ 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
。
或者,您可以使用宏来执行此操作,因为您可以将类型 (而不是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; }
以上就是c/c++开发分享在c 中交换任何类型的两个变量相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519160.html