swap( )函数指用来交换两个变量的值的函数。
int swap(a, b)
{
// switch the value of a and b.
return 0;
}
使用 C/C++ 编程时,经常需要自己实现一下swap( )函数,在实现的时候可能会遇到的问题在这个blog里归纳总结一下。
1. 直接交换(典型错误)
例子如下
int swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
return 0;
}
调用上面这个swap( )函数不会改变两个变量的值。 因为参数传递时传递的不是实参,而是实参的副本。因此,不会改变实参的值。
2. 使用指针进行交换
例子如下
#include <stdio.h>
int swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
return 0;
}
int main(int argc, char const **argv)
{
int x = 5, y = 10;
int *ptr_x = &x;
int *ptr_y = &y;
swap(ptr_x, ptr_y);
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}
操作两个变量的地址,可以方便地交换两个变量的值。
3. 使用引用进行交换(C++特性)
#include <iostream>
int swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
return 0;
}
int main(int argc, char const *argv[])
{
int i = 1, j = 2;
swap(i, j);
std::cout << "i = " << i << std::endl;
std::cout << "j = " << j << std::endl;
return 0;
}
毫无疑问,上述使用了引用的C++代码也可以实现变量值的交换。
既然讲到了引用,便讲一些“题外话”。
有时在看C++代码时,会看到一些类似下面这种的代码片段:
int function(int& a, const char t) {
// do something
}
其中 int& a 是一个C++独有的特性,引用。
引用与取地址不同之处在于,引用一出现必须初始化,而指针却不需要。
在C++中,既有引用又有取地址,引用、取地址的符号相同(都是’ & ')
因此也很难区分。
但他们的区别其实可以用一句话概括:
和类型在一起的是引用,和变量在一起的是取址。
1)引用在赋值=的左边,而取地址在赋值的右边
比如
int a = 3;
int &b = a; // 引用
int *p = &a; // 取地址
2)和类型在一起的是引用,和变量在一起的是取址。
举例如上,以及下例:
int function(int &i)
{
// do something.
} // i is a reference.
3)对于std::vector,上面2条同样适合
vector<int> vec1(10,1);
// initialize vec1: 10 elements, every element's value is 1
vector<int> &vec2 = vec1; // vec2 is reference to vec1
vector<int> *vec3 = &vec2; //vec3 is addresss of vec1 and vec2
另外,引用只是给变量起得别名,并不占据内存空间。
而指针一般需要占据四个字节的内存空间,并且比引用更加难以操作,存在内存泄漏的风险。
而在C++编程中,使用引用可以更加安全地达到与使用指针相同的功能。
因此,在C++中,应该更多注意使用引用。
本文探讨了C/C++编程中swap()函数的常见实现方法,包括直接交换(常犯错误)、使用指针交换以及C++特有的引用交换。详细解释了引用的特性,如引用作为赋值运算符左边的标识、与类型结合表示引用,以及与取地址的区别。强调在C++中,由于引用的安全性和便利性,推荐在适当情况下使用引用替代指针。
317

被折叠的 条评论
为什么被折叠?



