由于C语言是强类型语言,所以通常我们在编写一些函数的时候就需要指定函数的类型。这就会导致同样的函数行为因为处理的类型不同,就可能需要为不同的类型编写不同的函数版本。

比如用于交换两个变量值的如swap函数:

void swap(int *v1, int *v2) {

int *temp = v1;

*v1 = *v2;

*v2 = *temp;

}

上面的swap函数只能交换两个int类型的整数。

如果需要交换两个double类型的浮点数就需要再写一个double类型版本的swap函数:

void swap(double *v1, double *v2) {

int *temp = v1;

*v1 = *v2;

*v2 = *temp;

}

所谓泛型swap函数就是一个swap函数就能够处理不同类型的交换工作。在C++有模版来实现泛型,但是C语言中没有模板,所以我们可以使用void类型的指针来实现泛型swap函数,任何类型的指针都可以赋值给void类型的指针。

泛型swap函数实现:

void swap(void *v1, void *v2, size_t size) {

void *temp = malloc(size);

assert(temp != NULL);

memcpy(temp, v1, size);

memcpy(v1, v2, size);

memcpy(v2, temp, size);

free(temp);

}

先对函数中出现的3个函数分别加以说明:

malloc

函数原型为void *malloc(size_t __size)。该函数用来向堆中动态申请一块内存。它会向堆中动态申请参数__size个字节大小的内存空间,如果申请成功就返回申请到的空间首地址,申请失败就返回NULL。

memcpy

函数原型为void *memcpy(void *dest, const void *src, size_t n)。该函数用来实现内存拷贝,它把参数src所指向的内存空间拷贝n个字节到参数dest所指向的内存空间中。

free

函数原型为void free(void *ptr),该函数用来释放动态申请的内存。它把参数ptr所指向的动态申请的内存空间进行释放。

函数签名void swap(void *v1, void *v2, size_t size)中的前两个参数使用了void类型的指针,第三个参数size表示需要交换的类型在内存中所占字节数量。

第2~3行代码是向堆中申请size个字节大小的空间,然后将空间首地址赋值给temp指针,并断言内存是否申请成功。

第4~6行代码是通过内存拷贝的方式来实现交换步骤。

第7行代码是把在第3行代码中动态申请到的size个字节大小的内存空间进行释放,以免发生内存泄漏。

对swap函数进行调用,交换两个int类型变量的值:

int main() {

int a = 123;

int b = 321;

printf("before swap: %d, %d\n", a, b);

swap(&a, &b, sizeof(int));

printf("after swap: %d, %d\n", a, b);

return 0;

}

输出:

before swap: 123, 321

after swap: 321, 123

对swap函数进行调用,交换两个double类型变量的值:

int main() {

double a = 123;

double b = 321;

printf("before swap: %f, %f\n", a, b);

swap(&a, &b, sizeof(double));

printf("after swap: %f, %f\n", a, b);

return 0;

}

输出:

before swap: 123.000000, 321.000000

after swap: 321.000000, 123.000000

运行实现中的完整代码还需要引入头文件:

#include

#include

#include

#include

以上就是泛型swap函数的具体实现,主要是运用了void指针和内存拷贝。可以借鉴实现思路来研究关于C语言实现泛型的更多例子。

本作品采用《CC 协议》,转载必须注明作者和本文链接

c语言泛型swap函数,C 语言实现泛型 swap 函数相关推荐

  1. arg是什么函数_C 语言编程 — 函数

    函数 函数的本质就是针对变量的操作过程,同时可能也会改变当前程序的状态.它接受多个输入值,计算并返回一个输出值. 函数大体上分为 3 类: 主函数:每个 C 程序都至少有一个 main(). 内置函数 ...

  2. 编写c语言程序 斐波那契,请编写一个函数,生成并显示前n个斐波那契数.在主程序中测试...

    编写一个函数求n!,并编写主函数调用该函数 计算e=1+I/1!+1/2!+1/3!+...+1/n!:当n=10时结束 #includeintjiecheng(int);voidmain(){flo ...

  3. 第三章 函数 C++语言程序设计第五版 - 郑莉

    本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉 B站视频:https://space.bilibili.com/702528832/video PPT与代码已 ...

  4. fudge函数C语言,C语言程序设计-中国大学mooc-题库零氪

    第二周:计算 2.1 变量随堂测验 1.以下哪些是有效的变量名? A.main B.4ever C.monkey-king D.__int 2.给定: int a,b; scanf("%d ...

  5. 数组 函数 c语言,初学C语言-一维数组与函数

    数组与函数 数组 数组是有序的元素序列,简单点说就是存放数据的容器:数组一旦创建是不可更改的:数组中的元素在内存中是连续依次排列的. 如 int a[100]; 表示定义了一个有100个单元的数组a. ...

  6. R语言ggplot2可视化可视化聚类图、使用geom_encircle函数绘制多边形标定属于同一聚类簇的数据点、并自定义每个聚类簇数据点的颜色、多边形框的颜色(Cluster Plot)、主副标题题注

    R语言ggplot2可视化可视化聚类图.使用geom_encircle函数绘制多边形标定属于同一聚类簇的数据点.并自定义每个聚类簇数据点的颜色.多边形框的颜色(Cluster Plot).主副标题题注 ...

  7. R语言进行主成分分析(PCA)、使用prcomp函数进行主成分分析:碎石图可视化(scree plot)、R通过线图(line plot)来可视化主成分分析的碎石图(scree plot)

    R语言进行主成分分析(PCA).使用prcomp函数进行主成分分析:碎石图可视化(scree plot).R通过线图(line plot)来可视化主成分分析的碎石图(scree plot) 目录

  8. R语言使用str_locate函数和str_locate_all函数来定位特定字符串或者字符串模式在字符串中的位置:str_locate函数第一个位置、str_locate_all函数定位所有位置

    R语言使用str_locate函数和str_locate_all函数来定位特定字符串或者字符串模式在字符串中的位置:str_locate函数第一个位置.str_locate_all函数定位所有位置 目 ...

  9. R语言进行主成分分析(PCA):使用prcomp函数来做主成分分析、使用summary函数查看主成分分析的结果、计算每个主成分解释方差的、每个主成分解释的方差的比例、以及多个主成分累积解释的方差比例

    R语言进行主成分分析(PCA):使用prcomp函数来做主成分分析.使用summary函数查看主成分分析的结果.计算每个主成分解释方差的.每个主成分解释的方差的比例.以及多个主成分累积解释的方差比例 ...

最新文章

  1. html5页面默认的字符集是什么,HTML 字符集
  2. el replace 表达式_EL表达式截取字符串 各种字符串操作的方式全解 泽0715新浪博客...
  3. 一位大厂程序员回老家当公务员了!
  4. 使用云祺虚拟机备份软件恢复Citrix XenServer 虚拟机
  5. JAVA实现包含main函数的栈问题(《剑指offer》)
  6. 使用netty实现一个类似于微信的聊天功能
  7. C++ 堆区内存分配
  8. 使用Notepad++作为Latex编辑器
  9. Electron——常用的工具列表
  10. 关于GIS/RS的一些网站和论坛
  11. 管理感悟:公司内斗,肯定是闲着的斗干活的
  12. 微信小程序订阅消息:用云服务编写订阅消息超详细描述
  13. STM8S103之串口查询发送+中断发送
  14. [转]ceph pg peering过程分析
  15. ico生成工具ico制作工具ico在线制作
  16. Aggressive cows题解
  17. 81192!请返航!
  18. 五个学习管理系统的优点
  19. 机器学习算法各个击破
  20. 颜色的前世今生22·显示器偏色怎么办?

热门文章

  1. 护航绿色低碳经济,让数据中心的可持续发展“有章可循”
  2. 红宝书笔记《第7版》
  3. 三星S5PV210移植RTL8723BU WiFi驱动
  4. 联想thinkcentre微型计算机,联想ThinkCentre超小台式机
  5. 训练一次得到多个模型做集成的方法
  6. [教程] openmp/sa-mp联机服务器开发 零基础入门
  7. 什么电脑适合学计算机的大学生,第一台电脑要认真选,什么是适合大学生的笔记本...
  8. 电脑我的世界服务器无限刷甘蔗,我的世界怎么无限刷甘蔗_我的世界无限刷甘蔗视频教程_玩游戏网...
  9. 计算机防病毒学校,2018年最佳计算机防病毒软件
  10. 站长之家html转换,HTML/XHTML