C-通用内存交换函数

网易公开课学习,C语言的一个通用内存交换函数,然后自己又写了个指针的交换函数,在VC2010下创建一控制台程序,编译通过:

#include "stdafx.h"
#include <malloc.h>
void swap( void * ap, void * bp,int size);
void swap2( void ** app, void ** bpp);
int _tmain(int argc, _TCHAR* argv[])
{
      int a,b;
      a = 10;
      b = 20;
   /*改变指针指向,a、b内存块数据实际上没有改变*/
      void *ap,*bp; //可以定义成 int *ap,*bp,这样输出时可以不用转换,但swap2调用时参数需要加上(void **)进行转换
      ap = &a;
      bp = &b;
   printf("\n1、before swap\n");
      printf("a=%d,b=%d\n",a,b);
      printf("*ap=%d,*bp=%d\n",*(int *)ap,*(int *)bp);
      swap2(&ap,&bp);
   printf("after swap\n");
      printf("a=%d,b=%d\n",a,b);
      printf("*ap=%d,*bp=%df\n",*(int *)ap,*(int *)bp);
   /*交换a、b内存块中的数据*/
   printf("\n2、swap a b\n");
      printf("a=%d,b=%d\n",a,b);
      swap(&a,&b,sizeof(int));
      printf("a=%d,b=%d\n",a,b);
   /*字符串*/
      char stra[] = "abcdefghi";
      char strb[] = "123456789012";
   /*交换指针指向的地址,虽然字符串内存数据没有互换,但指针指向的字符串地址已互换*/
   void * strap = stra; 
   void * strbp = strb;
   printf("\n3、before swap\n");
      printf("stra=%s,strb=%s\n",stra,strb);
      printf("strap=%s,strbp=%s\n",(char *)strap,(char *)strbp);
      swap2(&strap,&strbp); 
   printf("after swap\n");
      printf("stra=%s,strb=%s\n",stra,strb);
      printf("strap=%s,strbp=%s\n",(char *)strap,(char *)strbp);
   /*对字符串而言,stra、strb都指向第一个字符所在的地址,当字符串长度不一致时,内存数据交换不完全*/
   printf("\n4、swap stra strb,only swap 7 chars\n");
      printf("stra=%s,strb=%s\n",stra,strb);
      swap((void*)stra,(void*)strb,7);
      printf("stra=%s,strb=%s\n",stra,strb);
      return 0;
}
/*
**通用内存交换函数,实现内存中的内容互换
**ap、bp为需交换的内存块首地址
**size 为交换内存块长度
*/
void swap( void * ap, void *bp,int size) {
      void *temp;
      temp = malloc(size);
      memcpy(temp,ap,size);
      memcpy(ap,bp,size);
      memcpy(bp,temp,size);
      free(temp);
}
/*
**两个指针指向地址互换
*/
void swap2( void ** app, void ** bpp) {
      void * tmp = *app;
      *app = *bpp;
      *bpp = tmp;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章