为什么需要使用2级指针(转载)

来源:互联网 发布:8月份信贷数据 编辑:程序博客网 时间:2024/06/14 16:23

原地址为    http://blog.163.com/xubin_3@126/blog/static/112987702200952392534107/


回答一:

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

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; 
        } 
回答二:

1)   工厂函数的参数 

struct   Obj   {}; 

void   CreateOneObj(Obj**   p) 

        *p   =   new   Obj; 


2)   2唯动态数组 

int**   a   =   new   int*[100};

回答三:

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

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

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

回答四:

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

回答五:

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


原创粉丝点击