//本程式用來測試幾種交換兩個指標的指向的方法,其中方法二和方法四是可行的
#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本身的值並沒有改變。