(2)链表中的一级指针和二级指针的问题

网址:http://blog.csdn.net/u012434102/article/details/44886339

  

摘抄:

  

 1 #include <iostream>    
 2 #include <string.h>    
 3 using namespace std;    
 4 
 5 void fun1(char* str)    
 6 {    
 7     str = new char[5];    
 8     strcpy (str, "test string");    
 9 }    
10 
11 void fun2(char** str)    
12 {    
13     *str = new char[5];    
14     strcpy (*str, "test string");    
15 }    
16 
17 int main()    
18 {    
19     char* s = NULL;        
20     cout << "call function fun1" << endl;    
21     fun1 (s);    
22     if (!s)    
23         cout << "s is null!" << endl;    
24     else    
25         cout << s << endl;    
26 
27     cout << "call function fun2" << endl;    
28     fun2 (&s);    
29     if (!s)    
30         cout << "s is null!" << endl;    
31     else    
32         cout << s << endl;    
33     return 0;    
34 } 
1 分析:
2 
3 在fun1中,当调用str = new char[5]时,str和s已经没什么关系了,相当于在fun1中复制了一个指针,这个指针指向的空间存储了字符串“test string”,但s仍指针NULL。当调用fun2时,因为是二级指针,s指向str,这里*str = new char[5],*str就是s,所以给*str分配空间就是给s分配空间。这样解释应该就很清楚了。
4 
5 画图为例:
6 
7 fun1执行时

我的理解:

      就是其实传的一级指针就是一个数,就是传值,只不过是传的大小是地址那么长,二级指针之所以改变了所指的内容,是因为再传的那个地址里面存的还是一个地址,所以,才会起作用。总之,看你想改变谁的值,要是你想改变一个指针里面存的值,那么肯定用指针的指针才可以啊,要是一个整型数据,就是一个整型指针就可以了,要是改一个整型指针里面的值,那么就得是整型指针的指针。

fun2执行时

1 如图所示,在fun1种str是s的拷贝,给str分配空间跟s没有关系,在fun2种str是二级指针,指向s,能够通过控制*str从而给s分配空间。
2 
3 后记
4 
5 用框图表示链表中二级指针或者一级指针的使用更加直白了。
6 
7 1,二级指针创建头指针。
8 
9 a.只有头指针,没有头结点 

b,有头指针,也有头节点

c,而如果不用二级指针,直接传一个一级指针,相当于生成L的拷贝M,但是对M分配空间与L无关了。

 

2,二级指针销毁头指针

 

原文地址:https://www.cnblogs.com/xiaoyoucai/p/7470836.html