什么时候必须用指针的指针呢?解决方案


什么时候必须用指针的指针呢?
什么时候必须用指针的指针呢?
请大家帮助谢谢。

c语言 指针 程序开发

smeagol 13 years, 3 months ago


比如当你需要改变两个指针的指向,而你又想通过参数返回这个指针:可以有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;

双面维诺妮卡 answered 13 years, 3 months ago


比如你想在函数中改变了一个传入的指针,而你又想通过参数返回这个指针那么你就要用到指针的指针了

放开那只电鸟 answered 13 years, 3 months ago


明确这点:用指针也就是传递的是地址,说明你想改变被指对象的值

那么你就知道用指针的指针是什么目的了吧

当然,也可以用指针的引用来代替指针的指针

节操即零食 answered 13 years, 3 months ago


1) 工厂函数的参数

struct Obj {};

void CreateOneObj(Obj* p)
{
*p = new Obj;
}

2) 2唯动态数组

int
* a = new int*[100};

这是谁的视线 answered 13 years, 3 months ago


通常情况下你想通过函数参数获取一段动态分配的内存时需要用到,比如:

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;
}


大江户战士 answered 13 years, 3 months ago

Your Answer