c++中指针和引用的思考

来源:互联网 发布:ng-bind. 数组 编辑:程序博客网 时间:2024/06/08 18:58

从宏观上来讲:指针是C++的一种内置数据类型,有自己的存储地址,而引用不是一种数据类型它只是变量的别名。

至于值指针和引用的其他区别,都必须从编译器对引用的实现来讲:

从引用的定义

Int a = 5; int&j = a;

上面是一个简单的引用的定义,现在大部分编译器都是用指针来实现的,上述代码编译器会转化成如下:

Int a = 5; int *const j = &a;

     从上述引用的定义可以看出引用和指针有两个区别:

     1 引用必须进行初始化,因为引用是一个const指针;

     2 引用无法绑定到一个空值上,因为无法对一个空值取地址(空值是右值)

        

从引用的使用:

j = 4;

         因为j在编译器看来是一个const指针,因此编译器代码会转会为:

         (*j) = 4;

         从这里可以看出,对引用的任何操作都会作用在引用绑定的变量上。所以很多人提到的一些区别,比如使用sizeof,++。这是因为两者在使用时有本质的区别,一个是对指针的操作,一个是对引用绑定的绑定的变量的操作。

       最后特意说一下,有的还提到引用是不占用内存。从上述的编译器引用的实现代码来看,引用的是占用的内存的因为定义了一个const指针,而这个指针是需要内存的。但是这个const指针并不是必须。

         比如上述代码,int a = 5; int &j = a;j =4;与int a = 5; a =4;效果是一样的。所以可以通过编译器的优化,节省这个内存。这个完全取决于编译器的实现。ISO中并未规定引用需不需要占用内用。

         总而言之,引用与直接使用变量相比,实现了一种形式上的方便,特别是在参数传递时,我们可以把引用传递理解为传递的是引用绑定的变量本身,而值传递传递的是参数的复制。


原创粉丝点击