一个交换程序的通用版本

简介: Author:bakari   Date:2012.9.3       交换程序是每个开始学习编程的人必学习的一个初级算法。算法思想很简单,就是为两个交换的双方在定义一个第三者即可。但越学到后面,你也许会发现这个程序也是蕴藏着很多知识点,并且一些知识点只要用这个作为例子就能非常好的理解,比如说在学习指针和函数时,一定会碰到的传值还是传指的问题。

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 }

既然结构体可以,其他数据类型就都没问题了。截图显示如下:

 

 

目录
相关文章
|
12月前
|
编解码 人工智能
FreeScale:无需微调即可提升模型的图像生成能力,生成 8K 分辨率的高质量图像
FreeScale是一个无需微调的推理框架,旨在提升扩散模型生成高分辨率图像和视频的能力。该框架通过处理和融合不同尺度的信息,首次实现了8K分辨率图像的生成,显著提高了生成内容的质量和保真度,同时减少了推理时间。
303 20
FreeScale:无需微调即可提升模型的图像生成能力,生成 8K 分辨率的高质量图像
|
传感器 存储 安全
智能包装:食品保鲜与追踪的创新
【10月更文挑战第20天】智能包装通过传感器、微电子和物联网技术,实现实时监测和调节食品环境条件,延长食品保鲜期,确保食品安全。本文探讨其基本原理、技术创新、实际应用及未来趋势,展示其在食品行业中的革命性变化。
|
芯片 UED 内存技术
全球 25 大高科技城市排名出炉:北上深上榜,但国内最牛的却是它?
随着城市化进程的加快,根据相关机构的估算,未来大部分人都会居住在城市中。和乡村相比,城市的优势在于更为完善的基础设施、商业圈,当然也包括科技方面。 近日,美国媒体 Business Insider 根据一些研究数据,在网站上放出一个全球 25 大高科技城市排名。其中,上榜的美国城市有 6 个、中国有 5 个、日韩印度各有一个,其他上榜的城市基本为加拿大和欧洲地区。
1983 0
全球 25 大高科技城市排名出炉:北上深上榜,但国内最牛的却是它?
|
传感器 编解码 算法
[硬件选型] 工业相机之相机分类
[硬件选型] 工业相机之相机分类
433 0
|
JavaScript 调度
万界星空科技MES与WMS如何集成的?
传统制造业数字化转型正汹涌而来,要进一步提高产业发展质量,重塑制造业竞争优势,就必须加快发展数字化制造,加紧推动制造业的数字化转型。
313 0
|
机器学习/深度学习 Web App开发 算法
强化学习(Reinforcement Learning)
强化学习(Reinforcement Learning)是机器学习的一个分支,旨在让智能体(agent)通过与环境的交互学习如何做出决策以最大化累积奖励。在强化学习中,智能体通过试错的方式与环境进行交互,并根据环境的反馈(奖励或惩罚)调整自己的行为。
470 0
|
Docker 容器
Docker容器占用CPU和内存高排查
Docker容器占用CPU和内存高排查
|
移动开发 安全 程序员
移动应用开发:Web App模式 、Native App模式及Hyprid App模式
移动应用开发:Web App模式 、Native App模式及Hyprid App模式
1228 0
|
XML JSON 编解码
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
接上篇《金蝶随手记团队的Protobuf应用实践(原理篇)》,本文将以iOS端的Objective-C代码为例,图文并茂地向您菔救绾卧趇OS工程中快速使用Protobuf,希望对你有帮助。
340 0
IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
|
存储 域名解析 监控

热门文章

最新文章