关于指针做为函数参数的一点研究

事情大概起源于这样一个问题:函数

#include<stdio.h>
void Try_change(int *p)
{
        int b=7;
        p=&b;
}
int main()
{
        int *p=NULL;
        int a=5;
        p=&a;
        Try_change(p);
        printf("%d\n",*p);
        return 0;
}

 

当我第一次看到这个题目的时候我以为答案是7,可是又好像是5,模模糊糊,傻傻分不清楚,这也是我想深刻探究下这个问题的缘由。测试

若是你一眼知道答案而且知道为何,但愿不吝指教。指针

 

首先这是一个指针做为函数变量的问题,之因此会对此类问题模糊,是由于对指针在参数传递过程当中的流程不是很清楚。blog

我最初的思路:继承

主函数定义一个指针------------经过函数调用将此指针传递到Try_change中------------在Try_change中改变指针的指向--------------回到主函数输出该指针的值内存

因为我看到在Try_change 中改变了指针的指向,并且参数传递是指针。因此就以为答案是7;io

然而经过测试发现答案依然是5,那么问题来了,到底是什么缘由呢?class

 经过看一些网友的资料明白:经过指针传递参数,其实质仍然是值传递,便是传递指针自己的地址。或者这样说更容易理解一些,即在Try_change中操做的形参,它不会改变实参的值,所以答案依然是5.变量

或者能够这样形象理解,形参是进入一个参数的时候临时克隆实参的一个家伙,这个家伙继承了实参的全部值,然而他和实参倒是两个不一样的家伙,Try_change函数内全部发生的行为只和形参有关,当函数结束的时候形参就会灰飞烟灭。而它所作的一切实参是没有丝毫影响的。im

 

下面详细用代码分析这个例子,看上面的YY是否成立。

#include<stdio.h>
void Try_change(int *p)
{
        int b=7;
        printf("Try p=%p &p=%p\n",p,&p);
        p=&b;
}
int main()
{
        int *p=NULL;
        int a=5;
        p=&a;
        printf("main p=%p &p=%p\n",p,&p);
        Try_change(p);
        printf("%d\n",*p);
        return 0;
}

 输出的结果是:

这里咱们能够看到:主函数中的指针和Try_change中的指针虽然值是同样的,可是地址倒是不同的,即他们属于两个不一样的指针变量,只是值相等罢了。

到这里彷佛真相大白了:指针做为参数在函数中传递的时候,它的实质依然是值传递,形参只是实参的一份拷贝,他们分别属于不一样的两个指针变量。

 

 

这样也就瓜熟蒂落的解决了不少其余问题:

好比:

在主函数有:int a=5; int *p=&a;  Try(p);

子函数有:int b=7;*p=b;

此时主函数最后输出b的值为7,这是由于虽然子函数中的指针是拷贝的,可是该指针的值也是a的地址,所以在子函数内进行对a的地址产生新的值的时候,主函数内的b也随之改变。

 在例如,使用形参分配内存的例子,也是显而易见的错误:

            void GetMemory(char* p)
            {
               char *p = new char[100];
            }
            void main()
            {
               char *str;
               GetMemory(str);
               strcpy(str, "hi"); // str = NULL
            }         

 由于这里的p和str本质上已经不是一个东东了。

我彷佛明白了什么,一直以来为何这么菜,由于历来没有静下心来思考每个本身恍惚的问题!

相关文章
相关标签/搜索