引用与指针的区别

来源:互联网 发布:js鼠标点击移动事件 编辑:程序博客网 时间:2024/05/15 03:51

引用与指针的区别


c++函数中,形式参数用引用和用指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数?什么时候用指针作参数呢
void function (int *ptr);  // 指针
void function(int &ref);   // 引用
没有 特定的规定。。学的久了,就 会习惯什么时候用指针什么时候用引用了!

引用与指针有什么区别?
1)
 引用必须被初始化,指针不必
2)
 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。

C++中尽量用引用。个人觉得所有的引用都可以用指针,但指针比引用容易出错。
引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针。
C++ 中一般都用引用就可以了 ... C 中没有引用,就使用指针 ....


举例如下:
1
 使用指针传递参数时:
void function (int *ptr) { 函数体;}
调用该函数时
main()
{ int p; function (&p); }


2
 使用引用传递参数时:
void function(int &ref) { 函数体;}
调用该函数时
main()
{ int p; function (p); }

由此可见,使用引用比使用指针传递参数函数调用时更简单,
引用和指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时,对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。

指针和引用的差别
1. 非空的差别,任何情况下都不能使用指向空值的引用.一个引用必须总是指向某个对象. 不存在的指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高.
2.
 合法性区别在使用引用之前不需要测试他的合法性.指针必须测试.
3.
 可修改区别指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变.


应该使用指针的情况: 可能存在不指向任何对象的可能性需要在不同的时刻指向不同的对象(此时,你能够改变指针的指向)
应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用引用。



理解指针和引用的区别
指针与引用看上去完全不同(指针用操作符’*’’->’,引用使用操作符’.’),但是它们似乎有相同的功能。
指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

  引用肯定会指向一个对象,在C里,引用应被初始化。

  string& rs; // 错误,引用必须被初始化
  string s(\"xyzzy\");
  string& rs = s; // 正确,rs指向s

  指针没有这样的限制。
  string *ps; // 未初始化的指针// 合法但危险

  不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

  void printDouble(const double& rd)
  {
     cout << rd; // 不需要测试rd,
  }          // 肯定指向一个double

  相反,指针则应该总是被测试,防止其为空:

  void printDouble(const double *pd)
  {
      if (pd)
      {    // 检查是否为NULL
         cout << *pd;
      }
  }

  指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

  string s1(\"Nancy\");
  string s2(\"Clancy\");

    string& rs = s1; // rs 引用 s1
  string *ps = &s1; // ps 指向 s1
  rs = s2;    // rs 仍旧引用s1  , 但是 s1的值现在是\"Clancy\"
   
    ps = &s2;   // ps 现在指向 s2; s1 没有改变

  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
 还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

  vector<int> v(10); //建立整形向量(vector),大小为10
   //向量是一个在标准C库中的一个模板
  v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

  如果操作符[]返回一个指针,那么后一个语句就得这样写:

  *v[5] = 10;

  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用
  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。
而在除此之外的其他情况下,则应使用指针 。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 政府下发的文件通知不履行该怎么办 给私人老板开车不给工资怎么办 给个体老板开车不给工资怎么办 户口转走在人才市场的档案怎么办 外来媳妇转上海户口没有档案怎么办 公务员考试笔试差9分面试怎么办 想从事人事方面的工作没经验怎么办 教师资格考试后户籍转走认定怎么办 总经理离职了作为高管的我怎么办 企业换总经理想换供应商应该怎么办 换了晶振时间还快怎么办 职场两个人都想要你的情况下怎么办 造价起步工资太低又结婚了怎么办 3d保存时写入文件出错怎么办 无经验想在工地承包点小活怎么办 一级建造师挂靠后中标后怎么办 用360对系统修补漏洞很慢怎么办 如果美国和俄罗斯开战中国会怎么办 戴牙冠前临时补牙材料掉了怎么办 设备间在业主家里每次上锁怎么办 成都安全员证原件丢了并过期怎么办 记不施工员证书号了怎么办 优易学车学员版登录不了怎么办 先科移动dvd主板坏了怎么办 离职单位不出劳动解除书怎么办 离职后一级建造师注册证怎么办 京牌货车报废挂靠公司不给办怎么办 二建挂靠注册证书到期了怎么办 二建证书挂靠公司不给钱怎么办 二建拿到证书原单位不解锁怎么办 凯云软件清单锁定只读了怎么办 苹果笔记本鼠标触摸板没反应怎么办 苹果笔记本键盘和触摸板失灵怎么办 苹果手机输入密码显示已停用怎么办 苹果7p手机刷机黑屏了怎么办 苹果5s来电接听屏幕卡顿怎么办? 手机摔了一下触屏失灵怎么办 小米手机摔了一下触屏失灵怎么办 苹果6sp触摸ic坏了怎么办 苹果4s屏幕摔裂了怎么办 新换的手机内屏颜色太亮怎么办