C++中引用与指针的区别

来源:互联网 发布:怎样成为一个网络作家 编辑:程序博客网 时间:2024/05/18 16:17

      不好意思各位,由于接朋友及同往新公司的路上耽搁了几天,实在抱歉,现在刚到公司与老总会晤,周一正式上班。现在坐了N天火车,现在也累也困,为了遵守前边许下的承诺,我又不得不马不停蹄的发篇学习文章,如有不到之处,欢迎大家补充下!好了,闲话少说,开干!

        C++中的引用跟指针,其实在某些情况下,实现的功能是一样的。那为什么有些人喜欢引用,而不喜欢指针呢?其实原因很简单,就 像现在许多的教科书或者相关技术文档上说,指针可以扎针孔,也可以砸地洞,说白了就是不好控制而已。其实这种说法是片面的,当你深刻了解了指针,懂得运用指针去灵活解决问题,我想这方面的担忧是多余的,这是庸人找的借口而已!那究竟有什么区别或者有什么异曲同工之妙呢?别着急,哥们马上开说!

         在说明之前呢,我觉得大家有必要学习或者重温下这两个概念:

         一、引用

         何为引用呢?其实概念很简单,就是一个变量的别名,操作这个别名,如同操作原对象(变量),实现的效果是一样的!举个简单又能说明问题的例子,就像一个人的 小名一样。他既可以叫张强,亦可以称呼其小强。

         那如何声明引用呢?举个例子:

         int a= 30;

          int &b = a;   // "&" 这个符号在这里的意思就是取一个变量引用的意思,起个变量的别名。

         ▲雷区:

          引用的声明必须同时被初始化,且引用一旦被初始化,则不可再次更改指向。<一夫一妻制,别妄想着享受夜夜睡新娘了!O(∩_∩)O ~~ 开玩笑!>记得上学那会,有同学会问,引用是不是仅仅作用于变量上,对象不可以被引用吗?答案是肯定的,是可以的。

         int &c;

         c = a;//这样的语法是错误的。

       二、指针

        何为指针呢?概念也很简单,指针是一个指向变量或者对象的内存地址的地址值。指针指向可以随时更改,前提该指针不是野指针!如果你还有些茫然或者理解不了,请参阅相关技术书籍大哥!

         声明指针可以一开始不用初始化,但是你如果不想惹不必要的麻烦的话,阿舰恳请您初始化一下吧,又累不死你!例如,下边有三种初始化的方法:

         (1)   int *p = NULL;  

         (2)   int *p;

                 p = NULL;

         (3)   int a = 20;

                int *p = &a;

        不仅仅是指针,建议您需要初始化,当您创建变量或者对象的时候,您最好也要初始化,这是一种编程规范。可以有效避免不必要的麻烦!

         ▲雷区:

         注意野指针(也有人称之为迷途指针,指的一回事!)。

        int *p = new int;
         *p = 20;
         delete p;
         *p = 30;

         这里的这个指针就是所谓的野指针了。依据代码,给出定义:如果原指针被delete掉后,你还用原来那个指针,那么你当前使用的指针就是野指针了。后果很严重,程序会崩溃!小心哈!

        那有人会问,如何避免这一糟糕事件的发生呢! 嘿嘿,很简单,当你删除之后,将其滞空,不再用它就欧了!

        规范代码:

        int *p = new int;
       *p = 20;
        delete p;
       p = NULL;

        这里其实大家还应该注意这样一个细节,当你删除该指针后(没将其滞空),其实该指针还是指向起初的内存地址,只不过该内存上的数据已经不是原来指向的数据了,往往编译器会将该位置重新分配给新的数据使用。最好是紧接着将其滞空为妙!少惹事吧大哥,对你有好处的!

         有关指针与数组,指针与函数,指针与对象,指针与类间的关系,由于时间关系,请您自行参阅相关技术书籍!人家比我也讲的好!

          三、 基础完了,言归正传,现在谈一下,引用与指针的区别:

          你现在已经知道了,引用实质上是被引用对象或者变量的别名而已,实际上也仅此而已,操作该对象,也等同于操作原对象本身一个性质。

           指针很随意,可以随时指向,前提不是野指针。

          那这两者到底有什么区别呢?

          (1) 指向限制:

                引用必须声明+初始一块干;(一夫一妻制)

                指针很灵活,可以随时更改指向,如果其不是野指针的话。(一夫多妻制)

          (2) 可否为NULL :

               不能有NULL引用,引用必须与合法的存储单元建立联系;

               指针可以为NULL。

        用途:

       有人肯定会好奇,学会引用或者学会指针,有什么用武之地吗?回答,那是必须的。不然谁会煞费苦心的设计没用的废物出来呢!

         能体现引用价值的地方,一般常用于两处,函数参数和参数的返回值。 对于作为函数参数来说,可以避免编译器对其内存拷贝,更重要的是,操作该引用如同在函数外部操作原对象一样的轻而易举,避免参数压栈,提高执行效率;作为函数的返回值来说,不得返回局部引用。

        对了,还需要说明一下,究竟什么时候使用引用的问题:

        1、传递的是一个大的对象

        2、想使用址传递外部变量,以使其更改

         3、拷贝构造函数、复制构造函数的参数

        4、返回 类数据成员(白话就是类对象)

 

        明晚发表常量、静态变量相关,敬请期待!

        好了,先聊到这吧,明晚继续~~~ 写这个还很耗时的~~~

 

                                                                                                                              2010年8月7日 下午

                                                                                                                                  阿舰         于日照

原创粉丝点击