ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++何时使用引用、指针?

2020-12-08 12:59:08  阅读:222  来源: 互联网

标签:对象 何时 C++ 传递 引用 使用 实参 指针


1、参数传递的方式:传值和传址

(1) 传值方式是将实参的值的拷贝传递给函数(方法),在方法内对形参进行操作,其对象是实参的拷贝,对实参不能造成影响.在方法结束返回后,形参被释放丢弃,实参的内容并不会改变;

(2) 传址方式,将实参的地址传递给函数(方法),在方法内对形参进行操作即等于对实参进行相同的操作,在方法结束返回后,形参同样被释放,实参的内容将会是对形参进行操作的结果.

传址方式,又可以细分为:引用传递(pass-by-reference) , 指针传递(pass-by-pointer)
引用其实就是对象的别名,传对象的引用,用于把一个对象的地址作为参数传过去而不是对象本身。这是我们就明白了前面问题的答案:传递引用,避免了一次实参到形参的拷贝,提高了效率。

2、何时使用引用参数

(1) 使用引用参数的主要原因有:
程序员能够修改调用函数中的数据对象
通过传递引用而不是整个数据对象,可以提高运行速度

(2) 对于使用传递的值而不做修改的函数: 如果数据对象很小,如内置数据对象,则按值传递
如果数据对象是数组,则使用指针,并将指针声明为指向const的指针
如果数据对象是较大的结构则使用const指针或const引用,以提高效率,节省复制结构所需的时间和空间
如果数据对象是类对象则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递类对象的标准方式是按照引用传递。

(3) 对于修改调用函数中数据的函数:
如果数据对象是内置数据类型则使用指针。
如果数据对象是数组则只能使用指针
如果数据对象是结构则使用引用或指针
如果数据对象是类对象则使用引用

3、结论

在c/c++编程中,到底什么时候该用指针来传递参数呢?总结如下:

  1. 需要改变实参的时候, 只能用指针.
  2. 传递大型结构并且"只读"其元素的时候,

因为大型结构通过值传递, 需要拷贝其每个元素, 这样效率太低.

  1. 需要遍历数组或频繁引用其元素时, 这样效率比使用下标高.

  2. 动态分配空间时, 必须使用指针.

  3. 传递数组时, 必须使用指针.

  4. 函数返回指针时, 比如fopen

  5. 另外,有时候需要使用二级指针,即指针的指针,例如:
    MemAllocate(char *a){
    a=(char *)malloc(sizeof(char));

}

当调用此函数进行内存分配时,发现不能分配内存不能成功,因为此时对于a来说,形参改变了,但实参并不会改变,他们对应于不同的内存单元。正确的写法应该是:

MemAllocate(char **a){

*a=(char *)malloc(sizeof(char));

}

这样就能够正确地分配内存了。

指针和引用很多时候效果是一样的,但是引用往往会带来阅读上的困难,因为在使用方法上和形参一样,但 是具备指针的特性。再加上
如果数据对象是类对象则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递const类对象的标准方式是按
照引用传递。其他时候用指针较好

4、其它

首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。

1.如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针

2.如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

3.不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
引用的一些规则如下:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

参考:
https://www.cnblogs.com/jingzhishen/p/5046631.html

标签:对象,何时,C++,传递,引用,使用,实参,指针
来源: https://blog.csdn.net/weixin_40437821/article/details/110870552

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有