对指针交换的讨论

 //本程序用来测试几种交换两个指针的指向的方法,其中方法二和方法四是可行的
#include<iostream>
using std::cout;
using std::endl;
void  swappoint1(int *p1,int *p2)  //方法一:传值和传地址的区别要看你对实参的那个形式进行操作
{   int *temp=p1;   //如果你对*p1和* p2进行操作的话,没有改变p1和 p2的指向,只是改变的是他们
 p1=p2;         //所指存储区的值,此时看成是传指针哈。但是如果对p1和p2进行操作,因为p1和p2
    p2=temp;       //本身是存储区的地址,可以看成是传值的形式,此时不能改变p1和p2的指向。
}                  //相信方法一是大多人都错误做法哈    

void  swappoint2(int*&p1,int * &p2) //方法二:采用指针的引用作为实参,那么传的就是指针本身的地址
{    int *temp=p1;   //即传的是左值,可以改变实参的地址和值,那么对p1和p2的操作就可以改变它们的
  p1=p2;          //指向,所以方法二有效 
     p2=temp;
}

void  swappoint3(int**p1,int **p2)//方法三:采用指针的指针作为实参,这样的话,但是对与p1与p2进行
{
 int ** temp=p1;              //操作来说,同方法一的解释,此时看成传值,故不能改变p1和p2的指向
 p1=p2;                       //故方法三是错误的
 p2=temp;
}

void swappoint4(int **p1,int **p2)//方法四:采用指针的指针作为实参,与方法三相反,此时对*p1和*p2的
{                                 //操作是对** 的下层操作,看成是传指针哈,所以是有效的
 int *temp=*p1;
 *p1=*p2;
 *p2=temp;
}

 
void main()
{
int a=1,b=2;
int *p1=&a,*p2=&b;
int **q1=&p1,**q2=&p2;
cout<<"用swappoint1函数交换两个指针之前的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
swappoint1(p1,p2);
cout<<"用swappoint1函数交换两个指针之后的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
cout<<"用swappoint2函数交换两个指针之前的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
swappoint2(p1,p2);
cout<<"用swappoint2函数交换两个指针之后的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
cout<<"用swappoint3函数交换两个指针之前的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
swappoint3(q1,q2);
cout<<"用swappoint3函数交换两个指针之后的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
cout<<"用swappoint4函数交换两个指针之前的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
swappoint4(q1,q2);
cout<<"用swappoint4函数交换两个指针之后的值:/n"<<"*p1="<<*p1<<"/n"<<"*p="<<*p2<<"/na="<<a<<"/nb="<<b<<endl;
}

//但是如果只要改变两个指针所指的存储区的值的话,对于方法一:可以对*p1和*p2操作,结果是改变a与b的值
//对与方法三:可以对**p1和**p2进行操作,结果是改变了a 与b 的值。
//而本程序的目的是改变指针的指向来交换值,但是a与b本身的值并没有改变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值