洛谷日志_支线(1):创建通用swap函数

在某个小程序里,需要频繁交换两个同类型数据,不能总是使用中间变量,所以为什么不能用一个swap函数来实现这个功能呢?

但是由于c语言并不支持泛型编程,所以在对数据大小的问题上需要特殊处理。

void swap(void *a, void *b, size_t size) {

首先我们创建一个空类型的函数swap,三个参数,分别是指向A、B变量的void指针和这两个数据类型的大小。

其中size_t类型一般用来储存数据的字节数,你也许觉得用int也可以,但事实上c标准中都是用size_t类型,好处的话可以上网查(其实是因为我还没怎么理解,但是按照标准来准没错。)

char temp[size];

创建一个字符数组作为缓冲区。

memcpy (temp, a, size);

使用memcpy函数,将a指向的变量缓存size个字节到缓冲区,实际上就是将a指向的变量值储存到temp中,只不过c语言对数据大小比较严格,所以这么操作。

memcpy (a, b, size);
memcpy (b, temp, size);

将变量b指向的值复制到a指向的地址中,然后将缓冲区的数据写到b的地址中,这么看起来和使用中间变量有异曲同工之处,但是不用在主函数中重复操作中间变量(例如你每次交换都要创建一个或者你每次使用都要初始化为0)。

另外,memcpy函数并不是用来交换两个变量的值,而是用于内存块之间的复制操作。通过这样的过程,完成了两个内存位置上的数据互换,但不是直接交换指针本身(即地址)。指针在过程中始终指向原来的内存位置,只是它们所指向的位置上的内容发生了改变。

由于memcpy函数是地址入参,所以我们应当输入a和b,而不是*a或*b。

swap (&x, &y, sizeof(x));

我们可以这样使用这个函数。需要注意必须是地址入参,将地址赋给形参,即void指针。

你可能感兴趣的:(洛谷日志,开发语言,c语言)