二级指针

一、对二级指针的理解

二级指针,即指向指针的指针。对于二级指针**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

结果:

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

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

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

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

posted @ 2016-04-20 19:04  泥石流小盆友  阅读(487)  评论(0编辑  收藏  举报