C/C++中的一元操作符 & 和 * 的理解

来源:互联网 发布:bios怎么设置网络启动 编辑:程序博客网 时间:2024/06/05 04:58

一、 & 操作符

        1、 & 可以作为取地址操作符,获取对象或者叫变量在内存中的地址(取地址操作符只能用于左值):

               

[cpp] view plaincopyprint?
  1. int a = 10;  
  2.   
  3. int  *pint = &a;   //这里就是把变量a的内存地址取出赋值给指针变量 pint。  


        2、 & 也可以作为引用操作符,网上很多人也称间接引用,在实际中具体就是作为另外一个变量或者对象的别名:             

[cpp] view plaincopyprint?
  1. int a = 10;  
  2.   
  3. int &b = a;    //这时就不是取地址啦,现在 b 相当于 a ,操作 b 等于操作了 a ,等于 a 多了一个别名。  

                & 的这种作为间接引用的使用,在C++中多数用于函数的参数中,如下:

               

[cpp] view plaincopyprint?
  1. void getSum( int a, int b, &sum){  
  2.   
  3.        sum = a + b;  
  4.   
  5. }  
  6.   
  7. int a = 10;  
  8.   
  9. int b = 5;  
  10.   
  11. int sum;  
  12.   
  13. getSum( a , b , sum);     //看出来了吗?函数getSum并没有返回函数,但却能使得变量sum的值产生改变。这就是C++中引入的代替传入指针的方案  
  14.   
  15. /* 
  16.  
  17.         为什么这样做呢?介入有如下: 
  18.  
  19.   (1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。 
  20.  
  21.   (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。 
  22.  
  23.   (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。 
  24.  
  25.        如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。 
  26.  
  27. */  

             注意:& 作为引用操作符的时候呢有如下几点必须注意的:

                                     1、&在此不是求地址运算,而是起标识作用;

                                     2、类型标识符是指目标变量的类型。                                                   

                                     3、声明引用时,必须同时对其进行初始化。

                                     4、引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

                                     5、声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也 不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。

                                     6、不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。


二、 *  操作符

        1、 * 作为指针使用:

[cpp] view plaincopyprint?
  1. int a = 10;  
  2.   
  3. int  *pint = &a;   //这里就是声明指针变量 pint,把变量 a 的地址赋值给 pint。  

        2、 * 作为解引用操作符使用。于其定义书上并没有给出明确的定义,不过其意思是对其得到操作数(必须为指针类型)所指变量的引用。:

            

int ival = 10;int *ip = &ival;  //这里大家都能看懂的 :)int &iref = *ip;  //*ip就是ival的引用。或者大家又可以这样理解,指针指向对象在内存中的地址,其值为内存地址,再经过 * 后,就直接操作内存中存放的值了。其等价于int &iref = ival;


最后,本人在网上找了一些对于指针以及引用的解释说明,都是各位达人的个人见解,他们唯一相同的是,对于这些概念定义说明每本书都不尽相同。希望大家根据各自的思维来理解为好。本人这原创文有不好之处请赐教。谢谢。

1、指针本质上讲是变量,和整型变量、字符变量等没有本质的区别。不同之处在于指针的值表示的是内存单元的地址,变量也就是引用内存单元地址的别名。所以定义一个指针变量就是给一个内存地址起了个别名而已。

2、C/C++中的指针其实就是一个变量,和其他类型的变量是一个样子的,它是一个占用四字节的变量(32位机上),它与其他变量的不同之处就在于它的变量值 是一个内存地址,指向内存的另外一个地方。reference我的理解就是一个别名,它和linux操作系统上的alias是一个样子的。再者,一个 pointer变量可以指向NULL,表示它不指向任何变量地址,但是reference必须在声明的时候就得和一个已经存在的变量相绑定,而且这种绑定 不可改变。


参考文章URL:http://zhidao.baidu.com/question/101184529.html
原创粉丝点击