You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现通用数组元素交换的方法探讨

实现任意类型数组元素的通用交换函数

当然有办法解决这个重复写swap函数的问题!不管你用的是C还是C++,都有成熟的泛型方案来实现一个能处理任意类型的通用交换逻辑,不用再为每个类型单独写函数了。下面给你几种实用的思路:

方案1:C语言中用void指针+字节拷贝

这种方法利用void*可以指向任意类型的特性,结合字节拷贝来实现交换,只要传入元素的大小即可。代码示例:

#include <string.h>

void generic_swap(void *a, void *b, size_t elem_size) {
    // 用栈上的临时缓冲区存储数据,也可以用malloc动态分配(注意释放)
    char temp_buf[elem_size];
    memcpy(temp_buf, a, elem_size);
    memcpy(a, b, elem_size);
    memcpy(b, temp_buf, elem_size);
}

使用示例

不管是int、char还是自定义结构体数组,都能直接用:

// 交换int数组元素
int nums[] = {5, 10};
generic_swap(&nums[0], &nums[1], sizeof(int));

// 交换自定义结构体数组元素
typedef struct {
    char name[20];
    int age;
} Person;
Person people[] = {{"Alice", 25}, {"Bob", 30}};
generic_swap(&people[0], &people[1], sizeof(Person));

方案2:C11及以上用_Generic宏实现类型自动推导

如果你的编译器支持C11标准,可以用_Generic宏来自动识别指针类型,调用对应类型的优化swap函数,或者 fallback 到通用的字节拷贝版本,这样用起来更简洁:

#include <string.h>

// 针对常用类型写优化的swap(比字节拷贝效率更高)
void swap_int(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

void swap_double(double *a, double *b) {
    double t = *a;
    *a = *b;
    *b = t;
}

// 通用字节拷贝版本
void generic_swap(void *a, void *b, size_t elem_size) {
    char temp_buf[elem_size];
    memcpy(temp_buf, a, elem_size);
    memcpy(a, b, elem_size);
    memcpy(b, temp_buf, elem_size);
}

// 定义宏,自动匹配类型
#define swap(a, b) _Generic((a), \
    int*: swap_int, \
    double*: swap_double, \
    default: generic_swap \
)((a), (b), sizeof(*(a)))

使用示例

调用时不用手动传大小,宏会自动处理:

int nums[] = {100, 200};
swap(&nums[0], &nums[1]);

double scores[] = {95.5, 88.0};
swap(&scores[0], &scores[1]);

方案3:C++中用模板函数(最简洁)

如果是用C++开发,直接用模板函数就搞定了,编译器会自动为每个用到的类型生成对应的swap函数:

template <typename T>
void swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

使用示例

直接传数组元素的引用就行,非常直观:

int nums[] = {1, 2};
swap(nums[0], nums[1]);

std::string strs[] = {"hello", "world"};
swap(strs[0], strs[1]);

注意事项

  • void指针方案要确保传入的elem_size是元素的真实大小,否则会出现内存越界或数据错误;
  • _Generic宏需要编译器支持C11及以上标准(比如GCC 4.9+、Clang 3.1+);
  • C++中其实标准库已经提供了std::swap,直接引用<algorithm>头文件使用官方实现就好,不用自己写。

内容的提问来源于stack exchange,提问作者BentesDentesRentes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:15:37