iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++引用和指针的区别你知道吗
  • 612
分享到

C++引用和指针的区别你知道吗

2024-04-02 19:04:59 612人浏览 独家记忆
摘要

目录引用1.引用概念2.格式3.引用特性4.常引用1.const引用5.使用场景1、引用作为参数2. 引用作为做返回值6.引用和指针的区别7.引用和指针的不同点:总结引用 1.引用概

引用

1.引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

比如:李逵,在家称为"铁牛",江湖上人称"黑旋风

2.格式

类型& 引用变量名(对象名) = 引用实体;

例:

void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}

在这里插入图片描述

注意:引用类型必须和引用实体是同种类型的

3.引用特性

引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体

例:

在这里插入图片描述

引用实例:

在这里插入图片描述

4.常引用

1.const引用

eg1:

在这里插入图片描述

const引用在传参引用时的意义:

1.可以保护形参返回不会改变实参的值(函数传参如果想减少拷贝而用了引用传参,如果函数中不改变这个参数,最好用const引用传参)

2.即可接受变量,也可接受常量。

eg2:

在这里插入图片描述

5.使用场景

1、引用作为参数

引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(c++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引 用。

[例]:


void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int main()
{
 int a,b;
      cin>>a>>b; //输入a,b两变量的值
      swap(a,b); //直接以变量a和b作为实参调用swap函数
      cout<<a<< ' ' <<b; //输出结果

}

在这里插入图片描述

由【例】可看出:

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给 形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效 率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的 形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

2. 引用作为做返回值

下面代码输出什么结果?为什么?

int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}

在这里插入图片描述

对于以上代码,是将c的别名传给了ret,结果确不确定,取决于平台销毁栈帧时,是否清理栈帧空间(由运行结果知;vs下不清理)那么我们进一步改动实验证明引用返回的危害:

int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	int &ret = Add(1, 2);
	Add(3, 4);
	cout << "Add(1, 2) is :" << ret << endl;
	return 0;
}

此时相当与retc的别名,再次运行:

在这里插入图片描述

结果出错。

举个恰当的例子:

在这里插入图片描述

因此注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

传值、传引用效率比较:

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

例:

#include <time.h>
struct A{ int a[10000]; };
void TestFunc1(A a){}
void TestFunc2(A& a){}
void TestRefAndValue()
{
A a;
// 以值作为函数参数
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作为函数参数
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
// 分别计算两个函数运行结束后的时间
cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}

在这里插入图片描述

值和引用的作为返回值类型的性能比较:

#include <time.h>
struct A{ int a[10000]; };
A a;
// 值返回
A TestFunc1() { return a;}
// 引用返回
A& TestFunc2(){ return a;}
void TestReturnByRefOrValue()
{
// 以值作为函数的返回值类型
size_t begin1 = clock();
for (size_t i = 0; i < 100000; ++i)
TestFunc1();
size_t end1 = clock();
// 以引用作为函数的返回值类型
size_t begin2 = clock();
for (size_t i = 0; i < 100000; ++i)
TestFunc2();
size_t end2 = clock();
// 计算两个函数运算完成之后的时间
cout << "TestFunc1 time:" << end1 - begin1 << endl;
cout << "TestFunc2 time:" << end2 - begin2 << endl;
}

在这里插入图片描述

通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大

6.引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的:

实例:

int main()
{
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 30;
return 0;
}

我们来看下引用和指针的汇编代码对比:

在这里插入图片描述

7.引用和指针的不同点:

引用在定义时必须初始化,指针没有要求

引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体没有NULL引用,但有NULL指针在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小有多级指针,但是没有多级引用访问实体方式不同,指针需要显式解引用,引用编译器自己处理

引用比指针使用起来相对更安全

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++引用和指针的区别你知道吗

本文链接: https://www.lsjlt.com/news/162232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++引用和指针的区别你知道吗
    目录引用1.引用概念2.格式3.引用特性4.常引用1.const引用5.使用场景1、引用作为参数2. 引用作为做返回值6.引用和指针的区别7.引用和指针的不同点:总结引用 1.引用概...
    99+
    2024-04-02
  • C语言中const和指针的秘密你知道吗
    目录指针的赋值问题ANSIC有关简单赋值的标准问题解决char*和constchar*char**和constchar**const修饰const修饰变量const修饰指针const...
    99+
    2024-04-02
  • C++与C语言的区别你知道吗
    目录1.结构体区别1.1.类型上不再需要struct关键字,直接用结构体名即可1.2.C++结构体中允许函数存在2.动态内存申请C语言的动态内存申请C++的动态申请3.内存池4.st...
    99+
    2024-04-02
  • C++的引用和指针有哪些区别
    本篇内容主要讲解“C++的引用和指针有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++的引用和指针有哪些区别”吧!引用和指针有如下三种区别:1 引用必须在声明时初始化,而指针不用;2...
    99+
    2023-06-17
  • golang 指针和引用区别
    指针和引用均用于间接访问变量:指针指向变量地址,直接访问变量。引用是别名,存储指向变量的指针,间接访问变量。指针用 * 定义和取消引用,修改指针会影响变量。引用用 &amp; 获...
    99+
    2024-04-21
    golang
  • c++中引用与指针的区别
    引用和指针都是用于处理内存地址的机制。引用在编译时绑定,始终指向同一内存地址,与对象共享相同内存空间。指针在运行时绑定,可以指向不同的内存地址,不与对象共享相同内存空间。引用用于不修改对...
    99+
    2024-05-06
    c++
  • Python eval()函数和ast.literal_eval()的区别你知道吗
    eval()函数可以将字符串型的list、tuple、dict等等转换为原有的数据类型 即使用eval可以实现从元组,列表,字典型的字符串到元组,列表,字典的转化,此外,eval还...
    99+
    2024-04-02
  • C++指针与引用有什么区别
    这篇文章将为大家详细讲解有关C++指针与引用有什么区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、引用与指针的区别指针和引用的原理非常的相似,所以很多时候尤其是面试的时候经常会拿来比较。本文来梳理一...
    99+
    2023-06-25
  • 你知道 Python 对象和 NumPy 之间的区别吗?
    Python 对象和 NumPy 都是 Python 编程语言中非常重要的概念,但它们之间有一些区别。在本文中,我们将探讨 Python 对象和 NumPy 的区别,并介绍如何使用 NumPy 进行数据处理和科学计算。 Python 对象 ...
    99+
    2023-07-06
    对象 apache numy
  • C++中指针与引用的区别有哪些
    这篇文章主要介绍C++中指针与引用的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、指针的声明上文中提到,指针和其所指向的变量就像硬币的两面,因此通过取址符号"&"我们可以找到...
    99+
    2023-06-20
  • C++指针与引用的区别案例详解
    C++中指针和引用的区别 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是...
    99+
    2024-04-02
  • C++中指针与引用的区别是什么
    这篇文章主要介绍了C++中指针与引用的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中指针与引用的区别是什么文章都会有所收获,下面我们一起来看看吧。1、指针的声明上文中提到,指针和其所指向的变量...
    99+
    2023-06-19
  • C++ 函数中引用参数和指针参数的区别
    在 c++++ 函数中,引用参数传递变量地址,对参数的修改影响原始变量,而指针参数传递指向地址的指针,对参数的修改不影响原始变量。 C++ 函数中引用参数和指针参数的区别 在 C++ ...
    99+
    2024-04-20
    引用参数 指针参数 c++ 内存占用
  • C++二级指针和指针的引用
    目录1、形参与实参均为指针时达不到此目的2、解决方案——指针引用或二级指针(1)形参为二级指针**p(2)形参为指针引用*&p3、总结 目的:形参指针...
    99+
    2024-04-02
  • 你真的知道onmouseenter与onmouseover的区别吗
    是的,onmouseenter与onmouseover是鼠标移入事件,它们的区别在于事件冒泡和触发频率。1. 事件冒泡:onmous...
    99+
    2023-09-21
    区别
  • 你知道Java中的索引与Django中的索引有什么区别吗?
    Java与Django都是非常流行的编程语言和框架,它们都支持索引操作,但是它们之间的索引有所不同。 一、Java中的索引 Java中的索引是一种数据结构,用于快速查找和访问数据。Java中有两种类型的索引:数组和集合。 数组索引是Java...
    99+
    2023-10-27
    linux django 索引
  • Spring Boot 和 Spring 到底有啥区别你知道吗
    目录什么是Spring?什么是Spring Boot?1、Maven依赖2、MVC配置3、配置模板引擎4、Spring Security 配置总结对于Spring和SpringBoo...
    99+
    2024-04-02
  • Js中var,let,const的区别你知道吗
    目录一:区别:二:var声明的作用域三:var声明的变量提升四、let声明五:彻底区分var和let声明变量(作用域区别)1.var声明2.let 声明 六:const 声...
    99+
    2023-02-08
    js var let const的区别 let var声明变量区别 const var let
  • 你知道在Java中Integer和int的这些区别吗?
    目录一、基本概念(重要)二、拓展三、new Integer()与new Integer()的比较四、Integer与new Integer()的比较五、Integer与Integer...
    99+
    2024-04-02
  • 实例详解C++中指针与引用的区别
    目录前言1、指针的声明2、使用new来分配内存3、malloc 与 new 的区别4、引用的声明与本质总结前言 在计算机存储数据时必须要知道三个基本要素:信息存储在何处?存储的值为多...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作