一个交换程序的通用版本
Author:bakari Date:2012.9.3
交换程序是每个开始学习编程的人必学习的一个初级算法。算法思想很简单,就是为两个交换的双方在定义一个第三者即可。但越学到后面,你也许会发现这个程序也是蕴藏着很多知识点,并且一些知识点只要用这个作为例子就能非常好的理解,比如说在学习指针和函数时,一定会碰到的传值还是传指的问题。学到C++又会有传引用的问题。这些问题我个人觉得只要用学习这个例子一般都可以理解清楚。
前不久有学长在跟我讲这方面的知识时又进一步补充了这个交换程序,他要求是只用一个函数就可以实现交换任意类型的数据,即对于任意类型的数据交换都是通用的。也许大部分人和我一样首先想到的是用模板函数。当然用模板函数可以实现,但讨论这个就没有什么意思了。后来经过学长的提示,豁然开朗,用(void *)不就可以了吗?见下面:
1 /* uElemSize 两者中最大的字节数 2 * 开辟(char *)的字节空间来作为辅助交换 3 * 用string函数memcpy()进行内存复制 4 */ 5 void Swap(void *p1,void *p2,unsigned int uElemSize) 6 { 7 assert(NULL != p1 && NULL != p2 && uElemSize > 0); 8 if(NULL == p1 || NULL == p2 || uElemSize <= 0) 9 return; 10 11 char * pBuffer = (char*)malloc(uElemSize); 12 13 memcpy(pBuffer,p1,uElemSize); 14 memcpy(p1,p2,uElemSize); 15 memcpy(p2,pBuffer,uElemSize); 16 17 free(pBuffer); 18 }
assert()断言是防御性编程经常用的技巧,对于小程序没必要这么用,但平时多用也是为了能够养成一个好的编程习惯。对于防御性编程,可以参考我的另一篇文章:http://www.cnblogs.com/bakari/archive/2012/08/27/2658215.html
程序就是如此神奇,只要我们静下心来,用心去思考,其实很多知识点我们都知道,只是没有深入去理解,所以常常出现一些似曾相识的模糊的状态,那叫一个痛苦啊,所以,学知识就要学会有取舍,然后由浅入深,做出成绩。下面是用结构体为例做的测试:
1 /***************************************************** 2 * Author: bakari 3 * Swap程序的通用版本 4 *****************************************************/ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<malloc.h> 8 #include<string.h> 9 #include<assert.h> 10 11 void Swap(void *p1,void *p2,unsigned int uElemSize); //用(void *)来指代任何类型 12 13 int main() 14 { 15 struct student{ 16 char ID; 17 char name[20]; 18 int score; 19 }stu1={'a',"huang",89},stu2={'b',"lixiang",98}; 20 printf("交换之前:\n"); 21 printf("%c %s %d\n",stu1.ID,stu1.name,stu1.score); 22 printf("%c %s %d\n",stu2.ID,stu2.name,stu2.score); 23 24 printf("\n交换之后:\n"); 25 Swap(&stu1,&stu2,sizeof(stu1)); 26 printf("%c %s %d\n",stu1.ID,stu1.name,stu1.score); 27 printf("%c %s %d\n",stu2.ID,stu2.name,stu2.score); 28 system("pause"); 29 return 0; 30 } 31 /* uElemSize 两者中最大的字节数 32 * 开辟(char *)的字节空间来作为辅助交换 33 * 用string函数memcpy()进行内存复制 34 */ 35 void Swap(void *p1,void *p2,unsigned int uElemSize) 36 { 37 assert(NULL != p1 && NULL != p2 && uElemSize > 0); 38 if(NULL == p1 || NULL == p2 || uElemSize <= 0) 39 return; 40 41 char * pBuffer = (char*)malloc(uElemSize); 42 43 memcpy(pBuffer,p1,uElemSize); 44 memcpy(p1,p2,uElemSize); 45 memcpy(p2,pBuffer,uElemSize); 46 47 free(pBuffer); 48 }
既然结构体可以,其他数据类型就都没问题了。截图显示如下:
更多干货请移步我的公众号「aCloudDeveloper」,专注技术干货分享,期待与你相遇。
一个交换程序的通用版本相关推荐
- VS2013安装OpenCV4.1版本并搭建一个小程序
<VS2013安装OpenCV4.1版本并搭建一个小程序> [注意1] 在"链接器=>输入=>附加依赖库"中,只添加opencv_world410d.lib ...
- 去除代码行号的一个小程序(控制台版本)
清风竹林发布了去除代码行号的一个小程序,确实方便大家收集一些文章代码,但个人认为象这样的小东东,要使广大网友能拿来就用,用.Net 2.0做成WinForm,有点贵族化了,于是动手整出个平民化的控制台 ...
- python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记
python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记 此篇为上一篇pyqt5图像压缩小工具改良版.因为比较简单,下面直接贴上代码. 效果图: # -*- coding: u ...
- java 插桩 工具_一个基于Eclipse的通用Java程序插桩工具.pdf
第38卷第7期 计算机科学 V01.38NO.7 Science 2011 2011年7月 Computer July 一个基于Eclipse的通用Java程序插桩工具 郑晓梅 (南京中医药大学信息技 ...
- 开发一个基于Dalvik字节码的相似性检测引擎,比较同一款Android应用程序的不同版本之间的代码差异(二)
上文我们说过,<针对Dalvik字节码的相似性检测引擎,比较同一款Android应用程序的不同版本之间的代码差异>这篇文章计划分两个部分来讲解,上文只介绍了如何利用Quarkslab公司开 ...
- c++版本opencv(02-第一个OpenCV程序 03.图像加载与保存)
c++版本opencv(02-第一个OpenCV程序) 一.02-第一个OpenCV程序 二,03.图像加载与保存 来自网易云课堂 一.02-第一个OpenCV程序 如果加载到了之后呢,我们就要对它进 ...
- CEVA-X16自由式编程-2-编写第一个“应用程序”
note:本文是我的原始文章的中文重写版本,语义上可能有一定出入 DSP地址空间"服务器" 在本文中,我尝试利用CEVA-X16自由式编程-1-指令穷举一文中所做的探索,用已知的汇 ...
- 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
MEDUZA MEDUZA是一款针对iOS应用程序的通用SSL解绑工具,该工具基于Frida开发,可以当作SSLKillSwitch工具的替代品.本来我是想自己开发自己用的,而且原本并不打算开源出来. ...
- IntelliJ IDEA + Maven环境编写第一个hadoop程序
1. 新建IntelliJ下的maven项目 点击File->New->Project,在弹出的对话框中选择Maven,JDK选择你自己安装的版本,点击Next 2. 填写Maven的Gr ...
最新文章
- Java项目:嘟嘟图片展览馆管理系统(java+Springboot+SpringMVC+JPA+Jsp+maven+mysql)
- Objective-C中对Url的参数进行编码
- [转] Web前端优化之 内容篇
- 空调吸气和排气_吸气剂和二传手被认为有害
- 【CodeForces - 1150A】Stock Arbitraging (贪心,水题)
- 机器学习实战 | 数据探索(缺失值处理)
- mysql limit原理_Mysql面试题锦集
- hashtable允许重复吗_在单位缴职工医保,老家有居民医保,能同时报销吗?相关部门这样回应...
- laravel mysql like_3分钟短文|Laravel 使用like匹配字符串的用法示例
- 2天玩转单反相机(第二讲)
- 【初识】汽车诊断协议 UDS / DoIP
- python docx文档_【IT专家】python操作docx文档
- Android平台音视频RTMP推送|GB28181对接之动态水印设计
- 【构建ML驱动的应用程序】第 5 章 :训练和评估模型
- uniapp和vue实现打开手机前置摄像头和相机的方法
- 产品设计 【网站转化率与漏斗模型】
- 计算机网络培训方案,计算机网络技术 专业培训方案
- 1rem、1em、1vh、1px各自代表的含义
- 蚂蚁森林能量java_使用autojs实现自动拾取蚂蚁森林能量与偷取朋友能量
- 给你推荐几款真人变漫画脸软件,没准你喜欢