引用和指针在交换中的区别

1.首先我们来先看看一个使用引用来交换的例子

#define DEMO 1

#include <iostream>
using namespace std;
void ptr_swap( int &v1, int &v2)
{
 v1=v1+v2;
 v2=v1-v2;
 v1=v1-v2;
}

int main()
{
 int ia = 1;
 int ib = 2;
 cout<<"交换前:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 ptr_swap(ia,ib);
 cout<<"交换后:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 system("pause");

}

这里是使用引用最基本的例子了。在交换函数中使用了一个技巧,注意这里的函数名最好不要使用swap,因为系统函数也是有一个swap函数的,这样就会导致你自己的函数没用调用,而是调用的系统函数。

 

2.我们再想,如果我们在交换中要交换的不实一个整形变量,而是一个整形变量的指针,我们应该如何做呢?

#define DEMO 2

#include <iostream>
using namespace std;
void ptr_swap( int* &p_v1, int* &p_v2)
{
 int * p_temp = p_v1;
 p_v1 = p_v2;
 p_v2 = p_temp;
 
}

int main()
{
 int ia = 1;
 int ib = 2;
 int *pa = &ia;
 int *pb = &ib;
 cout<<"交换前:"<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 ptr_swap(pa,pb);
 cout<<"交换后:"<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 system("pause");
 

}

运行上面的代码我们可以看到,当调用交换程序后,*pa和*pb的指向就改变了。但是ia和ib的值并没有改变

我们来看看不使用引用而仅仅是使用指针来改变变量的值是怎么做的

#define DEMO 3

#include <iostream>
using namespace std;
void ptr_swap(int* p_v1,int* p_v2)
{
 *p_v1 = *p_v1+*p_v2;
 *p_v2 = *p_v1 - *p_v2;
 *p_v1 = *p_v1 - *p_v2;
}

int main()
{
 int ia = 1;
 int ib = 2;
 int *pa = &ia;
 int *pb = &ib;
 cout<<"交换前:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 ptr_swap(pa,pb);
 cout<<"交换后:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 system("pause");

}

运行程序,我们至少可以发现有一点不同,那就是ia和ib和值在这里也发生了改变。而DEMO 2的程序ia和ib的值是没有发生变化的。

一般情况下,DEMO 2中我们改变指针变量的时候我们不希望改变变量的值,所以我们会在变量类型前加上const

#define DEMO 4

#include <iostream>
using namespace std;
void ptr_swap(const int* &p_v1,const int* &p_v2)
{
 const int * p_temp = p_v1;
 p_v1 = p_v2;
 p_v2 = p_temp;
 
}

int main()
{
 int ia = 1;
 int ib = 2;
 const int *pa = &ia;
 const int *pb = &ib;
 cout<<"交换前:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 ptr_swap(pa,pb);
 cout<<"交换后:"<<endl;
 cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
 cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
 system("pause");

}

我们再看看在DEMO 3中加上const会是什么样子的
#define DEMO 5
#include <iostream>
using namespace std;
void ptr_swap(cosnt int* p_v1,const int* p_v2)
{
  *p_v1 = *p_v1+*p_v2;
  *p_v2 = *p_v1 - *p_v2;
  *p_v1 = *p_v1 - *p_v2;
}
int main()
{
  int ia = 1;
  int ib = 2;
  const int *pa = &ia;
  const int *pb = &ib;
  cout<<"交换前:"<<endl;
  cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
  cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
  ptr_swap(pa,pb);
  cout<<"交换后:"<<endl;
  cout<<"ia="<<ia<<endl<<"ib="<<ib<<endl;
  cout<<"*pa="<<*pa<<endl<<"*pb="<<*pb<<endl;
  system("pause");
}
 
我们发现这时编译器会报错,因为我们函数的功能就是为了交换*pa和*pb的值,但是const的功能就是为了不让他们交换,所以编译器就会报错。
 
综上:如果我们仅仅是为了交换两个变量的值,我们可以使用的是引用(DEMO 1);
如果我们只是为了改变*pa和*pb的指向,就像是
const int *pa = &ia;
const int *pb = &ib;
改变成
const int *pa = &pb;
const int *pb = &ia;
而不改变变量本身的值,我们使用的是指针的引用(DEMO 2),一般我们都会加上const(DEMO 4);
如果我们既要改变变量的值,又要改变指针的指向,我们可以使用指针(DEMO 3)。

转至:http://blog.sina.com.cn/s/blog_7948916001013gew.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值