网易公开课学习,C语言的一个通用内存交换函数,然后自己又写了个指针的交换函数,在VC2010下创建一控制台程序,编译通过:
#include "stdafx.h"
#include <malloc.h>
#include <malloc.h>
void swap( void * ap, void * bp,int size);
void swap2( void ** app, void ** bpp);
void swap2( void ** app, void ** bpp);
int _tmain(int argc, _TCHAR* argv[])
{
int a,b;
a = 10;
b = 20;
{
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);
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);
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";
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);
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);
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);
}
**通用内存交换函数,实现内存中的内容互换
**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;
}
**两个指针指向地址互换
*/
void swap2( void ** app, void ** bpp) {
void * tmp = *app;
*app = *bpp;
*bpp = tmp;
}