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;
}

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