void fun(int **p)

int i=100;
int *t=&i;
*p=t;(或p=&t;)
}
int main(int argc, char* argv[])
{
int i=500;
int *p=&i;
fun(&p);
int temp;
temp=*p;
cout<<temp<<endl;
return 0;
}
在fun中对p的两种操作结果,输出结果是一样的吗?我感觉是一样的,但为什么输出结果不同?前一个是100,后一个是500?

解决方案 »

  1.   

    我感觉两种写法都存在问题,fun中i是个局部变量,*p的内容是指向i的指针,fun返回后*p的指向的东西就失效了
      

  2.   

    如果测的话
    void fun(int **p)
    {
         int *i = new int;
         p = &i;(*p = i;)
    }
    // 
    void main() 
    { int i=500;
    int *p=&i;
    fun(&p);
    int temp;
    temp=*p;
             delete (*p);
    cout<<temp<<endl;
    return 0;
      

  3.   

    void fun(int **p)
    {
         int *i = new int;     *i = 100;
         p = &i;(*p = i;)
    }
    // 
    void main() 
    { int i=500;
    int *p=&i;
    fun(&p);
    int temp;
    temp=*p;
             delete (*p);
    cout<<temp<<endl;
    return 0;
    }
      

  4.   

    没错,P指向的地址没有边,是FUN()中I的地址!但,FUN()结束后,地址中的内容已经变成不可预知的东西了,也许是地址的内容没有被重新分配,所以还是100,但也可能会是其他的数!!
      

  5.   

    我来解释一下,看看能否说明白,这简直是在搞文字游戏,把函数fun的参数p改成pt就清晰多了:
    void fun(int **pt)

    int i=100;
    int *t=&i;
    *pt=t;(或pt=&t;)
    }
    来看main中的情形
    int i=500;
    int *p=&i;//p的值是i的地址
    fun(&p);
    这时到了fun了,参数pt的值是p的地址.
    假设是这句:
    *pt=t;//这个可是相当于p=t啊,所以返回后temp是100!!
    再看这个
    pt=&t;//pt不指向p了,指到别处去了,但是p本身毫无影响,所以temp仍是500
      

  6.   

    楼上的分析很精辟,我也来说一下吧!主要是针对*pt = t;
    void fun(int **pt)

    int i=100;
    int *t=&i;
    *pt=t;
    }首先这种写法有问题,i的作用域是函数内部,当函数返回是变量i也被系统释放,i的内容也就不确定了,如果你在main()函数中打印输出不用
    int temp;
    temp=*p;
    cout<<temp<<endl;
    而是直接使用          cout << *p << endl;
              cout << *p << endl;
              cout << *p << endl;
    你就会看到结果是不是你所希望的了。所以这样用很不安全,也很别扭。