引言
从一开始我们学习c语言就知道直接传两个变量的值到一个函数里面去,在函数里面去交换这两个数是不可以的;
这样的操作就好比在一张复印品上面写写画画,最后在原稿上什么改变都没有;
例如:
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a, b;
a = 4;
b = 5;
swap(a, b);
printf("a = %d b = %d\n", a, b);
}
对于初学者这样的函数太多太多了;
后来我们改成了下面这样就可以了,知道了要传地址进去;
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a, b;
a = 4;
b = 5;
swap(&a, &b);
printf("a = %d b = %d\n", a, b);
}
至于为什么这样可以我们本文不做讲解,这牵扯到汇编的知识;
问题
现在我不想让这个函数仅仅用来交换两个整形数,我想让这个函数可以做更多的事情,比如交换浮点数,交换long
型;怎么办?
实现
通过上面交换两个整形数时的思路我们可以看出我们将两个地址传进了函数,函数内部交换了两个地址上的东西;那现在我也可以传进两个地址,并且穿进去一个size
之间交换两个地址上的内容;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(void *a, void *b, int size)
{
void *temp = malloc(size);
memcpy(temp, a, size);
memcpy(a, b, size);
memcpy(b, temp, size);
}
int main()
{
int a, b;
a = 5;
b = 4;
printf("%d %d\n", a, b);
swap(&a, &b, sizeof(int));
printf("%d %d\n", a, b);
}