c/c++开发分享在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; } 

      以上就是c/c++开发分享在c 中交换任何类型的两个变量相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/519160.html

      发表评论

      邮箱地址不会被公开。 必填项已用*标注