函数参数为指针类型(指针的指针&指针的引用)
2013-10-23 14:48
316 查看
/*首先,先看一段程序,弄清楚指向指针的指针 char **_p*/ #include <stdio.h> void main() { char ch = 'a'; char* p = &ch; char** _p = &p; printf("&ch = %d\n",&ch); printf(" p = %d\n",p); printf("&p = %d\n",&p); printf("_p = %d\n",_p); printf("*_p = %d\n",*_p); printf("**_p= %d\n",**_p); }
上面这段代码什么意思呢?
所以输出&ch = 1638212
p = 1638212
&p = 1638208
_p = 1638208
*_p = 1638212
**_p = 97
/*在了解了指向指针的指针的时候,下面我们就来看看函数为指针类型的时候会出现什么情况*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char *p) { p = (char *)malloc(sizeof(char)*10); } void main() { char *p=NULL; fun(p);//p仍为空 strcpy(p,"hello");//运行时错误 }
这是为什么呢??? 不是说在栈内申请的局部变量不可能这么用,但是这是动态申请的呀??
/*引用自高质量程序设计指针: 问题出现在fun函数内,编译器总是要要为每一个函数形参制作临时版本 指针参数p的副版本是_p,编译器使_p=p,如果函数体内的程序修改了_p指向的内容 就导致参数p指向的内容也做了相应的修改(因为他们指向了同一块内存),但是在本例中 _p申请了新的内存,只是把_p本身的值改变了,指向新的空间,但p本身丝毫没变, 所以运行错误,在这种情况下,每一次执行fun函数都会泄露一块内存,因为没有释放申请的, 即使申请了,我们也无法访问它 下面我就来证实这段话: */ #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char *p) { printf("befor malloc:\n"); printf("fun p=%d\n",p); printf("fun &p=%d\n",&p); p = (char *)malloc(sizeof(char)*10); printf("after malloc:\n"); printf("fun p=%d\n",p); printf("fun &p=%d\n\n",&p); } void main() { char ch = 'a'; char *p=&ch; fun(p); printf("after fun:\n"); printf("main p=%d\n",p); printf("main &p=%d\n",&p); } /* befor malloc: fun p = 1638212 fun &p = 1638128 after malloc: fun p = 3608328 fun &p = 1638128 after fun: main p = 1638212 main &p = 1638208
main 中 p 和 fun 中的 p开始都指向一块内存1638212 但是存储p的空间不同 main:&p=1638208 fun :&p=1638128 当malloc的时候 p = 3608328//即又指向了新的空间 &p=1638218//和malloc调用之前是一样的 而main中 p = 1638212 //指向的空间还是没变 */
/*现在原因搞清楚了,那么怎么办呢 这就要用到指针的指针,或者指针的引用 先看一个例子*/ #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(char **p) { *p = (char *)malloc(sizeof(char)*10); } void main() { char *p=NULL; fun(&p); strcpy(p,"hello"); printf("%s\n",p);//正确输出 } /*这个例子就正确输出了 为什么呢? 看一个图*/
/*这个例子就正确输出了 为什么呢?
先看一个图*/
/*明白了
在函数内,我要修改一个传进来的指针参数的指向,就在开辟一个空间,
空间内容是存放指针类型的,即指针的指针
函数内给指针类型的参数弄个副本,副本只可以修改它指向的内容
好的,那我就弄个指针的指针,我修改指针的指针类型_p指向的内容
内容正好也是一个指针, 说白了就是p的指向.这样我就可以间接的修改p的指向了
*/
相关文章推荐
- c++函数参数类型-引用、指针、值
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
- ”引用 & 指针“ -- 作为函数的参数和返回值小结
- C# 引用类型作为函数参数时
- c++函数参数类型-值,指针,引用
- 数组与字符串、字符指针与其他类型指针、赋值参数、指针参数以及引用参数、函数指针
- 【转】C++函数——指针和引用类型的参数传递
- 使用指针类型参数和使用指针引用类型参数在函数内部用new给参数分配空间的不同结果
- c++函数参数类型-引用、指针、值
- C++ 函数参数是引用和指针的时候的一些注意点。
- C++函数参数和返回值三种传递方式:值传递、指针传递和引用传递(着重理解)
- 函数调用参数改变的两种方法——指针与引用
- oj Problem F: 复杂类型作函数参数之结构体指针做参数
- ASP.NET AJAX 说明文档->客户端引用->全局命名空间->JavaScript 基础类型扩展->Array 类型扩展->clone 函数
- 使用指针表示引用类型描述函数内指针重定向的行为
- c++函数参数类型-引用
- C#中调用C++的dll的参数为指针类型的导出函数
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 6-2 程序填空(指针类型作为成员函数的参数)