一、对二级指针的理解
二级指针,即指向指针的指针。对于二级指针**p,理解如下图:
p=0x0001(指p的内容)
&p=0x0010(指p自己的地址)
*p=q=0x0002(指p指向的地址的内容)
**p=*q=str=0x0003(指一级指针p指向地址的内容)
其中,p是二级指针,q是p的一级指针
二、二级指针的使用
那什么情况下会使用二级指针呢??
需要将指针通过函数参数传递的方式,在函数内部对指针修改后,函数外部的指针对此修改仍能够生效。。
下面看几个例子。
例1.
传递给函数一级指针,函数体内改变指针的内容,函数体外指针内容不变。
1 #include2 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 }
结果:
分析:从结果可以看到,传递q指针时,函数参数的传递是值传递的过程,q的内容传递给了p,但是这个过程也是拷贝的过程,因为传递q指针,先拷贝一个指针副本q_copy,将该副本直接赋值给p,所以q的地址就跟p的地址不一样,改变p的内容时(将a的地址赋给p),q的内容并没有改变。
例2.
传给函数一级指针,函数体内改变指针所指向的内容,函数体外该指针所指向的内容改变
1 #include2 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 }
结果:
分析:从结果中看出,函数参数传入一级指针时,函数体内改变该指针所指向的内容后,在指针外也可以生效。
从上面两个例子,得出个结论:当函数所传参数是一级指针时,在函数体内对该指针内容进行操作,函数结束后,对该指针的修改不会生效,但是在函数体内对该指针所指向的内容进行修改,函数体外该指针指向的内容会随之改变。
例3.
传给函数一个二级指针,函数体内改变指针内容,函数体外该指针内容发生改变
1 #include2 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 }
结果:
分析:函数中传递的是二级指针,二级指针进行拷贝,二级指针的拷贝地址改变,二级指针指向的一级指针不变,对一级指针申请内存空间后,二级指针所指向的内容发生改变(即一级指针的内容改变)。
总之,我自己理解为:不管传入一级指针还是二级指针,在函数体内对指针作用时,只能对其下一层的或下下层的修改生效,对本层修改无效(二级指针对其一级指针的修改生效,一级指针对其所指向的内容的修改生效)。
---------------------------------------------------------------------------------------------------------------
韩友原创,转载请注明出处,谢谢博客园!