C++中“指针的指针”用法

来源:互联网 发布:windows iso镜像 编辑:程序博客网 时间:2024/05/16 16:21


出处:http://blog.chinaunix.net/space.php?uid=20498030&do=blog&cuid=274854

 好多人在学习C++,但对C++中的指针的指针很困惑,我就我认识拿来跟大家分享一下。

    系统使用4B的内存来存一个指针,也就是说我们申请了一个指针比如int *a=NULL,那么系统将为你分配4B的内存,而我们如果要再定义一个变量来存放指针的的内存地址,那么就需要指针的指针,比如,int **b=&a;

    “指针的指针”最常用的地方是在函数传值上,以及数组使用,其他用的地方我还没遇到。

    先说函数。
     内存的分配方式有3种:
    1 . 从静态存储区分配;
    2 . 从栈分配;
    3 . 从堆上分配,new ,malloc都是从这里分配的内存。

    函数的执行是在栈上执行的,函数中的局部变量都是在栈上分配的,在函数执行结束返回时这些变量都被销毁了,所以在函数返回的时候千万不要返回栈上的数据指针,要不然返回的指针所指向的数据都是垃圾数据。
    一般函数的返回值就够我们使用了,但是如果我们需要返回两个以上的参数,或者函数的返回值有其他用途(比如返回错误代码),我们的函数要返回值就要从参数获得了,这样的话我们要定义一个变量,然后把这个变量的地址传给函数,在函数的执行过程中对这个地址的内容进行修改,因为这个地址不在函数所在的栈,函数返回时它不会被销毁,这样就达到返回值的目的。

    比如一个函数是这样定义的:

[cpp] view plaincopy
  1. BOOL func(int *a)  
  2. {  
  3.   *a = 2;  
  4.   return TRUE;  
  5. }  
    函数的调用:
[cpp] view plaincopy
  1. int nAge;  
  2. BOOL nAge = func(&nAge);   
    但是如果本来变量是一个指针,比如 int *pAge = NULL; 那么要修改指针的值,就要把指针的地址传进函数:
    int *pAge;
    BOOL nAge = func(&pAge);
    func函数就应该这样写了:
    BOOL func(int **a)
    {
      // a 为指针的指针,*a为指针,**a为指针指向的地方,一个int值
      *a = 2;  //这是给指针赋值,
      **a = 3; //这是给指针指向的地方填值
      return TRUE;
    } // 这个函数不要使用,它将内存地址为2的地方4个字节赋了个3 ……
 

    当然了,一个int的变量用不着指针的指针,但是如果是一个链表的节点,链表的节点是用指针指着的,在函数中要对这个指针修改,就要传进指针的地址,那么这个指针的地址就要用指针的指针来存放了。(这句话到点子上了,chrisliu 注释)

    
    总之一句话,指针的指针就是存放了一个指针的地址的变量,它是一个变量,它占用4B的存储空间,一个实实在在的东西。它的用处是在函数中用来传出来指针值的。
    如果各位还发现有什么其他用处,大家就踊跃跟贴,呵呵,谢谢!

    指针的指针已经够用了,至于指针的指针的指针,好象没什么用处,不用说了。

    另外如果大家对COM有兴趣的话,就会发现COM的函数很多都用的是双星**参数,它们都是传出这个意思。
    以上仅是我个人认识,如果有错误,请大家提出来共同学习!  :)

原创粉丝点击