Answers
比如当你需要改变两个指针的指向,而你又想通过参数返回这个指针:可以有2中方法:
可以参考我的一个验证性程序中的方法四:
//本程序用来测试几种交换两个指针的指向的方法,其中方法二和方法四是可行的
#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(intp1,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;
通常情况下你想通过函数参数获取一段动态分配的内存时需要用到,比如:
bool GetMemory(int *lpData)
{
*lpData = new int [100];
memset(lpData, 0, 100);
if (lpData != NULL)
return true;
else
return false;
}
void main(void)
{
int *lpData = NULL;
if (GetMemory(&lpData))
{
for (int i = 0; i < 100; i++)
lpData[i] = i;
}