博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二级指针
阅读量:5034 次
发布时间:2019-06-12

本文共 2891 字,大约阅读时间需要 9 分钟。

一、对二级指针的理解

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

p=0x0001(指p的内容)

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

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

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

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

二、二级指针的使用

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

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

下面看几个例子。

例1.

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

1 #include 
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 
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 
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

结果:

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

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

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

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

转载于:https://www.cnblogs.com/tracyhan/p/5411943.html

你可能感兴趣的文章
带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
查看>>
css_去掉默认样式
查看>>
关于php开发中的字符编码问题总结的几个要点
查看>>
【原创】uwsgi中多进程+多线程原因以及串行化accept() - thunder_lock说明
查看>>
vi 卡住怎么办
查看>>
python 之sqlalchemy many to many
查看>>
Direct2D教程(三)简单几何图形
查看>>
手机GUI自动化测试介绍
查看>>
进程间通信——IPC之共享内存
查看>>
斐波拉契数列的由来
查看>>
第4课 脚本命令与登录程序
查看>>
Windows加密服务架构
查看>>
php with bootstrap
查看>>
firedebug调试Jquery
查看>>
相同属性类之间的转换
查看>>
关于GIT合并出错的记录
查看>>
线性代数作业
查看>>
Appium+python自动化18-brew、carthage和appium-doctor
查看>>
PythonWeb开发教程(二),搭建第一个django项目
查看>>
javax.transaction.xa.XAException: java.sql.SQLException: 无法创建 XA 控制连接。(SQL 2000,SQL2005,SQL2008)...
查看>>