zoukankan      html  css  js  c++  java
  • C++中指针形参问题

    1.C++指针做形参,会有很多陷阱,很多时候也许并不如我们想的那样。比如我们想通过一个函数改变指针的值:

    #include<</SPAN>iostream>
     using namespace std;
     void test_point(int *p)
     {
         int a=2;
         p=&a; //关键点
     }
     int main()
     {
         int x=1;
         int *p1=&x;
         test_point(p1);
         cout<<*p1<<endl;
        return 0;
     }

    这段代码明显想通过函数改变p1的值,但是结果却没有变化,输出仍旧是1。问题就出在关键点那里!

    2、再看一个代码:

    #include<</SPAN>iostream>
    using namespace std;
    void test_point(int *p)
    {
         int a=2;
         *p=a; //关键地方,体会与上一段代码的不同
    }
    int main()
    {
         int x=1;
         int *p1=&x;
         test_point(p1);
         cout<<*p1<<endl;
         return 0;
    }

    这段代码却能够改变输出值。区别就在*p=a与p=&a之间。

    3.《C++ primer(第四版)》105页可以发现其中的解释:

    对p=&a,称之为给指针赋值,意思是给指针本身一个指向的对象。

    而对*p=a称之为通过指针进行赋值,意思是改变指针所指对象的值。

    解释如下:对于p=&a,就是把函数形参指针p指向a(给指针赋值,赋上a的地址即可指向a),临时变量a在函数调用完之后就不复存在,实参p1

    也不会被改变,*p1=4;而*p=a就是通过指针进行赋值,也就是说*p是指指针p指向的值,给*p赋值a,就是给*p所指向的值赋值,指针传参传给形参p的是x的地址,也就是说在函数中*p其实表示给x赋值,这样即使局部变量a消失了,但是x的值早已通过指针真正改变了。

  • 相关阅读:
    HDOJ.1029 Ignatius and the Princess IV(map)
    STL之map
    STL之map
    UVA.1584 环状序列
    UVA.1584 环状序列
    AOJ. 数组训练.2016-11-17
    AOJ. 数组训练.2016-11-17
    AOJ.592 神奇的叶子
    AOJ.592 神奇的叶子
    技能书
  • 原文地址:https://www.cnblogs.com/fengfengqingqingyangyang/p/3224500.html
Copyright © 2011-2022 走看看