用C写第一个交换函数swap&&升级版

如何写一个交换函数

案例介绍

初级版

 void swap(int *p1, int *p2) 
 { 
	 int temp; 
 
 	temp = *p1; *p1 = *p2; *p2 = temp; 
 }

高级版(使用库函数)

#include <stdlib.h>
#include <string.h>

 int swap1(void *x, void *y, int size) 
 { 
	 void *temp;    //定义一个空指针
	 
	 if((temp = malloc(size)) == NULL) 
	 return -1; 
	 memcpy(temp, x, size); memcpy(x, y, size); memcpy(y, temp, size); //申请一个大小为size大小的内存
	 free(temp);    //释放内存
	 return 0; 
 }

程序关键点

  • 两个头—#include <stdlib.h>,#include <string.h>
  • 申请一个大小为size的内存赋值给temp
  • 交换值
  • 释放内存

高级版(不使用库函数)

 void byte_swap(void *pData1, void *pData2, size_t stSize) 
 { 
	 unsigned char *pcData1 = pData1; 
	 unsigned char *pcData2 = pData2; 
	 unsigned char ucTemp; 
 
	 while (stSize--){ 
	 ucTemp = *pcData1; *pcData1 = *pcData2; *pcData2 = ucTemp; 
	 pcData1++; pcData2++; 
	 } 
 }

参数详细说明

  • 初级版不详细说明(主要是数据进行交换,temp作为临时变量)缺点:只能转化int类型的函数(因为定义类型为int)。
  • 问题来了我想写一个函数可以适用所有数据类型怎么办呢???
  • 高级版对初级版进行了抽象升级,首先将两个输入参数类型为 void *(ps:就是定义一个空指针),这样就可以传入所有类型的变量,int size 就是交换的数据的大小。

函数分析:我们边可以定义一个空指针temp和mallo配合使用

memcpy(temp, x, size); memcpy(x, y, size); memcpy(y, temp, size);

这段就是数据交换函数,记得最后要使用free函数释放指针。

仿真测试&结果

 #include <stdio.h> 
 #include <string.h> 
 
 void swap(int *p1, int *p2) 
 { 
	 int temp; 
 
 	temp = *p1; *p1 = *p2; *p2 = temp; 
 }
 int swap1(void *x, void *y, int size) 
 { 
	 void *temp; 
	 
	 if((temp = malloc(size)) == NULL) //申请一个大小为sizi的内存 
	 return -1; 
	 //交换函数 
	 memcpy(temp, x, size); memcpy(x, y, size); memcpy(y, temp, size); 
	 free(temp); 
	 return 0; 
 }

 int main(int argc, char *argv[]) 
 { 
 	int iNum = 0x11223344; 
	int iNum1= 0x44332211;
	
	
	printf("%8x,%8x\n",iNum,iNum1);
	swap(&iNum,&iNum1);
	printf("%x,%x\n",iNum,iNum1);
	swap(&iNum,&iNum1);
	printf("%x,%x\n",iNum,iNum1);
	swap1(&iNum,&iNum1,1);
	printf("%x,%x\n",iNum,iNum1);

 }

结果如下
11223344,44332211
44332211,11223344
11223344,44332211
11223311,44332244
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值