南湖虫子论坛深切关注灾区 我们和灾区人民永远在一起!
发新话题
打印

[原创] 对c++中几种交换两个指针的指向的方法的讨论

对c++中几种交换两个指针的指向的方法的讨论

//本程序用来测试几种交换两个指针的指向的方法,其中方法二和方法四是可行的
#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本身的值并没有改变。

TOP

发新话题