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

菜鸟js进阶---一元操作符

找工作找到崩溃的我。昨天一位找了一个月的同事建议我系统的学习下原生js,于是就买了本《JavaScript高级程序设计》书,昨天买的,今天就到了。想了想,自己私下写demo也好。但是貌似现在好多的公司...
  • sinat_31076477
  • sinat_31076477
  • 2017年03月10日 13:09
  • 418

重载一元、二元运算符

8.6 重载一元运算符 类的一元运算符可重载为一个没有参数的非static成员函数或者带有一个参数的非成员函数,参数必须是用户自定义类型的对象或者对该对象的引用。实现重载运算符的成员...
  • lycnjupt
  • lycnjupt
  • 2015年07月25日 20:50
  • 1167

c++中操作符的重载简单理解

操作符的简单解析
  • qq_35116371
  • qq_35116371
  • 2016年10月11日 17:03
  • 195

C++ 重载操作符 operator

参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数; ...
  • fenhong91
  • fenhong91
  • 2017年02月07日 09:55
  • 829

一元多项式化简

背景: 编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。   说明:  l 多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。 l ...
  • sxh850297968
  • sxh850297968
  • 2015年07月07日 19:22
  • 1633

用c++程序解答一元二次方程,并且输出相关属性

1:首先分析一下需求,需要哪些东西          1、大致需求是根据一元二次方程的几个系数,输进去,然后通过c++计算,得出对应的值          2、需要写输入的功能,输入功能分别对三个值做...
  • panker2008
  • panker2008
  • 2015年05月21日 13:02
  • 1348

【Openjudge:Noi】7891:一元三次方程求解 c++

【Openjudge:Noi】7891:一元三次方程求解 总时间限制:  1000ms  内存限制:  65536kB 描述 有形如:ax3+bx2+cx+d=0  这样的一...
  • u013675643
  • u013675643
  • 2016年07月01日 16:25
  • 1228

【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)

所实现的一元多项式的结构如下图所示: 若只对多项式进行“求值”等不改变多项式系数和指数的运算,采用类似顺序表的顺序存储结构即可,否则应采用链式存储结构,本文因为要进行一元多项式的加法,加法,乘...
  • ZongYinHu
  • ZongYinHu
  • 2015年08月26日 20:32
  • 1800

问题三十七:C++怎么解一元四次方程?(3)——怎么解一元四次方程

37.3 怎么解一元四次方程? 用“费拉里”方法求解:将四次方程化为两个二次方程,然后求解二次方程。   ------------------------------...
  • libing_zeng
  • libing_zeng
  • 2017年01月15日 16:35
  • 773

C#操作符??和?:用法

先看如下代码:   string strParam =Request.Params["param"]; if ( strParam== null ) {    strParam= ""; }   st...
  • lybwwp
  • lybwwp
  • 2016年05月05日 17:47
  • 2475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++中的一元操作符 & 和 * 的理解
举报原因:
原因补充:

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