当前位置: 首页 > news >正文

引用与指针的区别

在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. 可修改区别指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变.
应该使用指针的情况: 可能存在不指向任何对象的可能性 需要在不同的时刻指向不同的对象(此时,你能够改变指针的指向)
应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用引用。
   
要首先好好理解指针和引用的区别
    指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。
指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,
但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,
例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”

  char *pc = 0; // 设置指针为空值

  char& rc = *pc; // 让引用指向空值

  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。
如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。

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

 

转载于:https://www.cnblogs.com/wangliangliang/p/3178983.html

相关文章:

  • 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(三)
  • Android 百度地图定位(手动+自动)
  • Swing的Look And Feel机制研究
  • html Ie 6,7,8 a超链带灰底
  • iMatrix平台核心功能——工作流管理介绍
  • 缓存、缓存算法和缓存框架简介
  • 【学习笔记10】Linux常用命令7 - 网络通信、系统关机
  • SetFileAttributes
  • “与客户的一次沟通”的所思、所虑、所得
  • Delphi Listveiw用法大全
  • apache日志存放位置(转)
  • Centos和RHEL的区别
  • Cacti监控tomcat的方法
  • clean code meaningful names
  • 从动漫产业到动漫文化
  • 网络传输文件的问题
  • 【comparator, comparable】小总结
  • Android框架之Volley
  • Angular数据绑定机制
  • classpath对获取配置文件的影响
  • const let
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • EOS是什么
  • ES6系列(二)变量的解构赋值
  • Mocha测试初探
  • Python_网络编程
  • socket.io+express实现聊天室的思考(三)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 给github项目添加CI badge
  • 利用DataURL技术在网页上显示图片
  • 如何胜任知名企业的商业数据分析师?
  • 我的面试准备过程--容器(更新中)
  • 我们雇佣了一只大猴子...
  • ​Java并发新构件之Exchanger
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #每日一题合集#牛客JZ23-JZ33
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2022 CVPR) Unbiased Teacher v2
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (一)kafka实战——kafka源码编译启动
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .Net8 Blazor 尝鲜
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • [<事务专题>]
  • [2021 蓝帽杯] One Pointer PHP