您的位置:首页 > 其它

函数参数为指针类型(指针的指针&指针的引用)

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的指向了

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐