zoukankan      html  css  js  c++  java
  • 二级指针

    一、对二级指针的理解

    二级指针,即指向指针的指针。对于二级指针**p,理解如下图:

    p=0x0001(指p的内容)

    &p=0x0010(指p自己的地址)

    *p=q=0x0002(指p指向的地址的内容)

    **p=*q=str=0x0003(指一级指针p指向地址的内容)

    其中,p是二级指针,q是p的一级指针

    二、二级指针的使用

    那什么情况下会使用二级指针呢??

    需要将指针通过函数参数传递的方式,在函数内部对指针修改后,函数外部的指针对此修改仍能够生效。。

    下面看几个例子。

    例1.

    传递给函数一级指针,函数体内改变指针的内容,函数体外指针内容不变。

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void func(int *p)
     5 {
     6     int a = 20;
     7     p=&a;
     8     cout << endl << "p的地址:" << &p << endl << "p的内容:" << p << endl << "p指向的内容:" << *p << endl << "a的地址:" << &a << endl;;
     9 
    10 }
    11 int main()
    12 {
    13     int *q = NULL;
    14     int b = 10;
    15     q = &b;
    16     cout << "调用函数前:" << endl<< "q的地址:" << &q << endl << "q的内容:" << q << endl << "q指向的内容:" << *q << endl << "b的地址:" << &b << endl;
    17     func(q);
    18     cout << endl << "调用函数后:" << endl << "q的地址:" << &q << endl << "q的内容:" << q << endl << "q指向的内容:" << *q << endl;
    19     return 0;
    20 
    21 }
    View Code

    结果:

    分析:从结果可以看到,传递q指针时,函数参数的传递是值传递的过程,q的内容传递给了p,但是这个过程也是拷贝的过程,因为传递q指针,先拷贝一个指针副本q_copy,将该副本直接赋值给p,所以q的地址就跟p的地址不一样,改变p的内容时(将a的地址赋给p),q的内容并没有改变。

    例2.

    传给函数一级指针,函数体内改变指针所指向的内容,函数体外该指针所指向的内容改变

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void func(int *p)
     5 {
     6     *p = 20;
     7     cout << endl << "调用函数时:" << endl << "p的地址:" << &p << endl << "p的内容:" << p << endl << "p指向的内容:" << *p << endl;
     8 
     9 }
    10 int main()
    11 {
    12     int *q = NULL;
    13     int b = 10;
    14     q = &b;
    15     cout << "调用函数前:" << endl<< "q的地址:" << &q << endl << "q的内容:" << q << endl << "q指向的内容:" << *q << endl << "b的地址:" << &b << endl;
    16     func(q);
    17     cout << endl << "调用函数后:" << endl << "q的地址:" << &q << endl << "q的内容:" << q << endl << "q指向的内容:" << *q << endl;
    18     return 0;
    19 
    20 }
    View Code

    结果:

    分析:从结果中看出,函数参数传入一级指针时,函数体内改变该指针所指向的内容后,在指针外也可以生效。

    从上面两个例子,得出个结论:当函数所传参数是一级指针时,在函数体内对该指针内容进行操作,函数结束后,对该指针的修改不会生效,但是在函数体内对该指针所指向的内容进行修改,函数体外该指针指向的内容会随之改变。

    例3.

    传给函数一个二级指针,函数体内改变指针内容,函数体外该指针内容发生改变

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void func(int **p)
     5 {
     6     *p = (int*)malloc(sizeof(int));
     7     **p = 1;
     8     cout << endl << "调用函数时:" << endl << "p的地址:" << &p << endl << "p的内容:" << p << endl << "p指向的内容:" << *p << endl;
     9     cout << "一级指针所指向的内容:" << **p << endl;
    10 }
    11 int main()
    12 {
    13     int *q = NULL;
    14     int b = 10;
    15     q = &b;
    16     cout << "调用函数前:" << endl<< "q的地址:" << &q << endl << "q的内容:" << q << endl << "p指向的内容:" << *q << endl << "b的地址:" << &b << endl;
    17     func(&q);
    18     cout << endl << "调用函数后:" << endl << "q的地址:" << &q << endl << "q的内容:" << q << endl << "p指向的内容:" << *q << endl;
    19     return 0;
    20 
    21 }
    View Code

    结果:

     分析:函数中传递的是二级指针,二级指针进行拷贝,二级指针的拷贝地址改变,二级指针指向的一级指针不变,对一级指针申请内存空间后,二级指针所指向的内容发生改变(即一级指针的内容改变)。

    总之,我自己理解为:不管传入一级指针还是二级指针,在函数体内对指针作用时,只能对其下一层的或下下层的修改生效,对本层修改无效(二级指针对其一级指针的修改生效,一级指针对其所指向的内容的修改生效)。

      ---------------------------------------------------------------------------------------------------------------

    韩友原创,转载请注明出处,谢谢博客园!

  • 相关阅读:
    基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
    人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)
    android加固签名工具(源码下载)
    如何优雅的写一篇安利文-以Sugar ORM为例
    写给独立开发兄弟共勉-寂寞是19首诗和2首悲歌
    我开源了一个ios应用,你们拿去随便玩
    android用欢迎界面加载运行环境
    用c#操作Mongodb(附demo)
    sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
    怎样阻止Linux服务器执行rm -rf /*命令
  • 原文地址:https://www.cnblogs.com/tracyhan/p/5411943.html
Copyright © 2011-2022 走看看