zoukankan      html  css  js  c++  java
  • 指针的引用-ZZ

    原文出处

    复习数据结构的时候看到指针的引用,两年前学的细节确实有点想不起来,于是查了一下网上的资料,并且自己实践了一下,总结了一句话就是:

    指针作为参数传给函数,函数中的操作可以改变指针所指向的对象和对象的值,但函数结束后还是会指向原来的对象,若要改变,可用指针的指针或者指针的引用。

         ps:对原po的代码稍作修改,看上去更直观些。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 void foo(int *&t, int *y)//此处是int *t还是int *&t,决定了调用该函数的指针本身会不会被修改。分别跑一下程序即可知。
     5 {
     6     t = y;
     7     //*t = 4;
     8     cout << "foo1:" << t << endl;
     9     cout << "foo2:" << y << endl;
    10 }
    11 
    12 int main()
    13 {
    14     int num = 4;
    15     int num2 = 5;
    16     int *p = &num;
    17     int *q = &num2;
    18     cout <<"p: "<< p << endl;
    19     cout <<"q: "<< q << endl;
    20     foo(p, q);
    21     cout << "after foo" << endl;
    22     cout <<"p: "<< p << endl;
    23     cout <<"q: "<< q << endl;
    24     cout <<"*p: "<< *p << endl;
    25     cout <<"*q: "<< *q << endl;
    26     cout << "************" << endl;
    27     cout<<"num: "<< num<<endl<<"num2: "<<num2<<endl;
    28 }

    未加&时:                                                      加了&时                       

      

     可以看出,未加&时,指针在函数中值被修改(即指向了其他对象),但从函数中返回后仍然指向原来对象(值未被修改)。

    而加了&时,指针在函数中值被彻底修改,返回后也是被修改的状态,指向了其他对象。

    本质上和一个int a与int& a的区别一样。

     ===================================================================================================

    下面是代码和截图:

      1、首先是传递指针

    #include<iostream>
    using namespace std;
    void foo(int *t,int *y);
    int main()
    {
        int num = 4;
        int num2 = 5;
        int *p = #
        int *q = &num2;
        cout<<p<<endl;
        cout<<q<<endl;
        foo(p,q);
        cout<<p<<endl; 
        cout<<q<<endl; 
        cout<<*p<<endl;
        cout<<*q<<endl;
        cin>>num;
     
    }
    void foo(int *t,int *y)
    {
        t = y;
        *t = 4;
        cout<<t<<endl;
        cout<<y<<endl;
    }

      q所指向的值改变,但最后p,q都还指向原来的对象

     

      2、传递指针的引用

    #include<iostream>
    using namespace std;
    void foo(int *&t,int *y);
    int main()
    {
        int num = 4;
        int num2 = 5;
        int *p = #
        int *q = &num2;
        cout<<p<<endl;
        cout<<q<<endl;
        foo(p,q);
        cout<<p<<endl; 
        cout<<q<<endl; 
        cout<<*p<<endl;
        cout<<*q<<endl;
        cin>>num;
     
    }
    void foo(int *&t,int *y)
    {
        t = y;
        *t = 4;
        cout<<t<<endl;
        cout<<y<<endl;
    }

      函数执行后p和q指向同一对象。 

     

      3、指针的指针

      差点被绕晕了,指针的引用还好理解,传递参数的时候直接传递指针就好,但是指针的指针就需要把那参数的几种形式理解清楚:t是传递的指针的地址,相当于foo函数中的&y,*t是指针的值,也就是所指向的对象的地址,所以我下面代码里改变他所指向的对象是用*t = y;**t就和*y表示的意思一样了,就是指向对象的值。

    #include<iostream>
    using namespace std;
    void foo(int **t,int *y);
    int main()
    {
        int num = 4;
        int num2 = 5;
        int *p = #
        int *q = &num2;
        cout<<p<<endl;
        cout<<q<<endl;
        foo(&p,q);
        cout<<p<<endl; 
        cout<<q<<endl; 
        cout<<*p<<endl;
        cout<<*q<<endl;
        cin>>num;
     
    }
    void foo(int **t,int *y)        //t是指针的地址,*t是指针的值,也就是指向的对象的地址
    {
        *t = y;
        cout<<*t<<endl;
        cout<<y<<endl;
    }

      

  • 相关阅读:
    获取路径API:GetCurrentDirectory、GetModuleFileName
    任务栏显示程序详解
    MSXML读取XML文件
    解决VS断点无效问题
    非console程序显示DOS窗口
    Windows系统版本宏_WIN32_WINNT对应值
    sql2005 reporting service,我总算找到一个完全程序化绑定报表(ado.net dataset 绑定reprot)的方案,谁能再给我些其他建议呢? Carlwave
    在ASP.net中保存/取出图片入/从SQL数据库(可用于上传图片) Carlwave
    谁能谈谈国外软件行业的实际情况么?(全美“50大好差事” 软件工程师排名第一) Carlwave
    转:微软今年必做三大事(from csdn.net) Carlwave
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4101373.html
Copyright © 2011-2022 走看看