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

转载 2013年12月03日 20:53:19

一、 & 操作符

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

               

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


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

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

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

               

  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、 * 作为指针使用:

  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

相关文章推荐

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

一、 & 操作符         1、 & 可以作为取地址操作符,获取对象或者叫变量在内存中的地址(取地址操作符只能用于左值):                 int a = 10; in...
  • ichsonx
  • ichsonx
  • 2012年08月10日 14:42
  • 2809

C++解一元二次方程。以字符串ax^2+bx+c=d(d>=0)的形式输入

显然在这个题目中,如何解析输入的字符创是主要问题,我的思路是用'+',‘-’,‘=’分段这个字符串,并将每段的开头用一个vector变量记录下来(第一段开始点为0,要手动加入),如分成ax^2    ...

C/C++中sizeof操作符的用法

sizeof是C/C++语言的一种单目操作符,它不是函数。sizeof操作符返回值为其操作数的存储大小,用字节数表示。操作数可以是一个表达式或括在括号内的类型名。 sizeof的结果是size_t,它...
  • zcyzsy
  • zcyzsy
  • 2017年05月04日 16:08
  • 222

sizeof不是函数,而是C/C++中的一个操作符(operator)

sizeof(int)说明sizeof不是一个函数,函数不接受int做为形参 sizeof  int 也可以说明sizeof不是一个函数,因为实参没有加() ...
  • e3399
  • e3399
  • 2012年04月14日 13:01
  • 755

C/C++ 位操作符使用

 本章小结:1.掩码就是一串2进制对目标字段进行位与运算,屏蔽当前的输入位。将源码与掩码经过逻辑运算得出新的操作数。其中要用到逻辑运算如OR运算。AND运算。用于如将ASCLL码中大写字母改作小写字母...

c/c++中出现的位操作符

按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算。  注意:负数按补码形式参加按位与运算。 “与运算”的特殊用途: (1)清零。  (2)取一个数中指定位 方法:找一个数,...

自增自减操作符在C与C++中的左值区别

今天网上看到一个华为的面试题目: 写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值 int a = 4; (A)a += (a++); (B) a += (++a) ;(...
  • julysee
  • julysee
  • 2015年02月12日 14:36
  • 250

C/C++位操作符号详解

C/C++位操作符号详解 一、位运算: | 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。 & 按位与...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++中的一元操作符 & 和 * 的理解
举报原因:
原因补充:

(最多只允许输入30个字)