网址: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,二级指针销毁头指针