浅谈c/c++中的swap( )函数

本文探讨了C/C++编程中swap()函数的常见实现方法,包括直接交换(常犯错误)、使用指针交换以及C++特有的引用交换。详细解释了引用的特性,如引用作为赋值运算符左边的标识、与类型结合表示引用,以及与取地址的区别。强调在C++中,由于引用的安全性和便利性,推荐在适当情况下使用引用替代指针。

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 = 3int &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++中,应该更多注意使用引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值