C指针参数传递

C指针参数传递
#include <iostream>
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<<endl;
}
/*
分析:乍一看这个程序的输出结果好像是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<<endl;
}
2 修改指针指向的内容,而不是指针本身,如下:
void fn(int* p1)
{
    int *p2=new int;
    *p2=10;
     *p1=*p2;
}
void main()
{
    int *p=new int;
    fn(p);
    cout<<*p<<endl;
}
3 使用二级指针,当然这个方法和2的本质是一样的
void fn(int **p1)
{
    int *p2=new int;
    *p2=10;
     *p1=p2;
}
void main()
{
    int *p=new int;
    fn(&p);
    cout<<*p<<endl;
}
*/
C语言中实参变量和形参之间的数据传递是单向的“值传递”方式,指针变量作为函数参数也要遵循这一规则,调用函数不能改变实参变量的值,但可以改变实参变量所指变量的值。
二级指针是存放一级指针地址的指针.

猜你喜欢

转载自blog.csdn.net/tumblerman/article/details/15027263