C指针参数传递
#include
using namespace std ;
void fn(int *p1)
{
int *p2=new int;
*p2=10;
p1=p2;
}
void main()
{
int *p=new int;
fn(p);
cout<<*p<
}
/*
分析:乍一看这个程序的输出结果好像是10,实际上并不是,为什么呢?
主要有两个原因造成
1 函数fn的参数是值传递方式,值传递将导致调用该函数时,传递实参后,函数修改的是实参的
一个副本,而并不实实参本身,所以指针p指向的值并未改变
2 函数fn中修改的是指针本身,而不是指针的内容,修改指针本身,不会改变指针所指向的内容
而这里修改的还是指针p的副本,所以p根本就不会改变,如果修改的是指针指向的内容那就
不一样了,即使是值传递也无所谓,因为无论是指针本身,还是指针的副本,他们指向的都是
同一个值。
解决办法:
经过上面的分析,有两个解决办法:
1 不使用值传递,使用引用传递,传送指针的引用,如下:
void fn(int* &p1)//传递整型指针p的引用,这样修改的是p本身,而不是p的副本,因为引用只是p的一个别名而已
PS:个人理解,说INT(*p)J 是按值传递,只是传递地址的副本,而不是在真正的地址上操作.
{
int *p2=new int;
*p2=10;
p1=p2;
}
void main()
{
int *p=new int;
fn(p);
cout<<*p<
}
2 修改指针指向的内容,而不是指针本身,如下:
void fn(int* p1)
{
int *p2=new int;
*p2=10;
*p1=*p2;
}
void main()
{
int *p=new int;
fn(p);
cout<<*p<
}
3 使用二级指针,当然这个方法和2的本质是一样的
void fn(int **p1)
{
int *p2=new int;
*p2=10;
*p1=p2;
}
void main()
{
int *p=new int;
fn(&p);
cout<<*p<
}
*/
C语言中实参变量和形参之间的数据传递是单向的“值传递”方式,指针变量作为函数参数也要遵循这一规则,调用函数不能改变实参变量的值,但可以改变实参变量所指变量的值。
二级指针是存放一级指针地址的指针.
阅读(850) | 评论(0) | 转发(0) |