广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中传值、传地址和传引用的区别是什么
  • 433
分享到

C++中传值、传地址和传引用的区别是什么

2023-06-20 17:06:30 433人浏览 安东尼
摘要

小编给大家分享一下c++中传值、传地址和传引用的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!传引用定义传值与传地址,相信大家都了如指掌了,在这里先介绍

小编给大家分享一下c++中传值、传地址和传引用的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

传引用定义

传值与传地址,相信大家都了如指掌了,在这里先介绍一下什么是引用?

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

说白了,引用就是给变量起外号,比如一个人可以有乳名,有学名,有笔名,其实就都是一个人而已。

例:林冲,江湖上人称“豹子头"

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

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

C++中传值、传地址和传引用的区别是什么

可以看出a 和ra地址是一样的,足以证明,引用就是变量本身。

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

意思是:对象用 int 定义的,那么引用必须是 int&

引用特性

1. 引用在定义时必须初始化

#include<iOStream>using namespace std;void TestRef(){int a = 10;int& ra;  // 该条语句编译时会出错int& ra = a;int& rra = a;printf("%p %p %p\n", &a, &ra, &rra);}int main(){TestRef();return 0;}

C++中传值、传地址和传引用的区别是什么

int ra&; // 不赋初值,会报错

一个变量可以有多个引用,一个人可以有多个外号

#include<iostream>using namespace std;void TestRef(){int a = 10;int& ra = a;int& rra = a;printf("%p\n%p\n%p\n", &a, &ra, &rra);}int main(){TestRef();return 0;}

C++中传值、传地址和传引用的区别是什么

引用一旦引用一个实体,再不能引用其他实体,意思是,raa 的引用后,就不能再引用别的对象

传引用与传值的区别

1、 传值、传引用返回的比较

传值返回:

#include<iostream>using namespace std;int Add(int a, int b){int c = a + b;return c;}int main(){int ret=Add(1,2);cout << "ret:" << ret << endl;return 0;}

C++中传值、传地址和传引用的区别是什么

注意: 返回时,c会将自己的值,复制给一个临时变量,ret接收的其实是c的拷贝,c在 Add 函数调用结束后,随着栈帧的销毁,而销毁。

c的拷贝变量一般开在,调用c所在函数的函数中,此例就是在main函数中开辟,当返回变量较小时,业可能在寄存器中开辟空间存放返回变量的拷贝

传引用返回:

#include<iostream>using namespace std;int& Add(int a, int b){int c = a + b;return c;}int main(){int& ret=Add(1,2);cout << "ret:" << ret << endl;return 0;}

大家猜猜结果是什么呢?

3 吗?

C++中传值、传地址和传引用的区别是什么

结果是随机值,这是为什么呢?

因为返回的是 c 的引用,也就是 c本身,而 c 变量是存储在栈帧中,随着函数的结束,栈帧销毁,c也随着销毁,空间释放,这时就造成非法引用,值为随机值。

那怎么办呢?

不将c放到栈帧中就可以了,将c放到 静态区

#include<iostream>using namespace std;int& Add(int a, int b){static int c = a + b;return c;}int main(){int& ret=Add(1,2);cout << "ret:" << ret << endl;return 0;}

C++中传值、传地址和传引用的区别是什么
C++中传值、传地址和传引用的区别是什么

再来一个有趣的题,下面代码的结果是什么呢?

#include<iostream>using namespace std;int& Add(int a,int b){int c = a + b;return c;}int main(){int& ret = Add(1, 2);Add(5, 7);cout << ret << endl;return 0;}

很多人会以为是 3

C++中传值、传地址和传引用的区别是什么

结果是 12 ,可是并没有输出 Add(5,7) 。为什么会是12呢

C++中传值、传地址和传引用的区别是什么

调用Add(1,2)后,将结果返回ret,ret此时是3,栈帧销毁,释放空间,后又调用Add(5,7),重新开辟栈帧,此时开辟的栈帧和上次销毁的是一个地方。ret还指向上一个c的位置,此时c=5+7;

#include<iostream>using namespace std;int& Add(int a,int b){int c = a + b;return c;}int main(){int& ret = Add(1, 2);Add(5, 7);printf("你是真狗\n");cout << ret << endl;return 0;}

此时输出是随机值,是因为,又调用了printf函数,占用了释放的空间,ret虽然还指向原来c所在的空间,但是,值已经是随机值了。

C++中传值、传地址和传引用的区别是什么

2、传值、传引用效率比较

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

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

C++中传值、传地址和传引用的区别是什么

可以看出传引用的效率,远胜于传值

下面传值返回与传引用返回比较

#include<iostream>#include<time.h>using namespace std;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;}int main(){TestReturnByRefOrValue();return 0;}

C++中传值、传地址和传引用的区别是什么

可以看出传引用返回的效率,远胜于传值

所以,可以 传引用的时候要传引用,效率更高,但要注意,局部变量不可以传引用,出了函数,栈帧销毁,就会越界访问。

传指针(地址)与传引用的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

在底层实现上,引用和地址是一样的,在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

#include<iostream>#include<time.h>using namespace std;int main(){int a = 10;// 在语法上,这里给a这块空间取了一个别名,没有新开空间int& ra = a;ra = 20;// 在语法上,这里定义个pa指针变量,开了4个字节,存储a的地址int* pa = &a;*pa = 20;int b = 10;int*& rpa = pa;rpa = &b;return 0;}

C++中传值、传地址和传引用的区别是什么

可以看出,引用和指针在汇编实现上是一样的。那么他们的效率也是一样的。

指针和引用的区别:

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

  2. 引用在初始化时引用一个实体后,就不能再引用其他实体而指针可以在任何时候指向任何,一个同类型实体

  3. 没有NULL引用,但有NULL指针

  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指始终是地址空间所占字节个数(32位平台下占4个字节)

  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

  6. 有多级指针,但是没有多级引用

  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

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

以上是“C++中传值、传地址和传引用的区别是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++中传值、传地址和传引用的区别是什么

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

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

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

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

下载Word文档
猜你喜欢
  • C++中传值、传地址和传引用的区别是什么
    小编给大家分享一下C++中传值、传地址和传引用的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!传引用定义传值与传地址,相信大家都了如指掌了,在这里先介绍...
    99+
    2023-06-20
  • C++中传值、传地址和传引用究竟有哪些区别
    目录传引用定义传引用与传值的区别传指针(地址)与传引用的区别总结传引用定义 传值与传地址,相信大家都了如指掌了,在这里先介绍一下什么是引用? 引用不是新定义一个变量,而是给已存在变量...
    99+
    2022-11-12
  • C/C++值传递和址传递有什么区别
    这篇文章主要为大家展示了“C/C++值传递和址传递有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/C++值传递和址传递有什么区别”这篇文章吧。C/C++的按值传递和按地址传递有明显不...
    99+
    2023-06-25
  • php中传值与传址的区别是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑值传递值传递是 PHP 中函数的默认传值方式,也称为“拷贝传值”。顾名思义值传递的方式会将实参的值复制一份再传递给函数的形参,所以在函数中操作参数的值并不会对函数外的实...
    99+
    2021-08-13
    php 传值 传址
  • 解析C/C++值传递和址传递的区别
    C/C++的按值传递和按地址传递有明显不同,下面对他们作个区别: 按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。 按地址传...
    99+
    2022-11-12
  • java中值传递和引用传递的区别是什么
    在Java中,值传递(pass by value)和引用传递(pass by reference)是两种不同的参数传递方式。值传递是...
    99+
    2023-08-14
    java
  • php按值传递和引用传递的区别是什么
    这篇文章主要讲解了“php按值传递和引用传递的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php按值传递和引用传递的区别是什么”吧!说明按值传递中php必须复制值。特别是对于大型...
    99+
    2023-06-20
  • PHP中传值与传引用有什么区别
    在PHP中,传值和传引用是函数参数传递的两种方式。1. 传值:函数传递的是实参的值的副本。在函数内部对参数的修改不会影响到外部的实参...
    99+
    2023-09-27
    PHP
  • JavaScript中值传递和引用传递有什么区别
    JavaScript中值传递和引用传递有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称...
    99+
    2023-06-14
  • PHP中传值与传引用的区别
    PHP中传值与传引用的区别:传值要重新构造一份原参数的拷贝,而传引用则不需要。传值改变变量值的大小,都不会影响到函数外边的变量值,而传引用对值的任何改变,在函数外部也有所体现。传值对参数的修改不会改变原参数,而传引用时可以直接修改原参数。...
    99+
    2022-10-16
  • java中值传递和引用传递有哪些区别
    这篇“java中值传递和引用传递有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java中值传递和引用传递有哪些区别...
    99+
    2023-07-04
  • JS中值传递和引用传递的区别有哪些
    这篇文章主要介绍了JS中值传递和引用传递的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释...
    99+
    2023-06-14
  • Java的传值与传引用是什么
    本篇内容介绍了“Java的传值与传引用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常的说法是:对于基本数据类型(整型、浮点型、字符...
    99+
    2023-06-17
  • 在编程技术中传值和传址的区别有哪些
    这篇文章给大家分享的是有关在编程技术中传值和传址的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。传值和传址的区别:1、在传值中函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上...
    99+
    2023-06-06
  • C语言函数传递数组和传递地址的区别你知道吗
    目录传递数值传递地址注:总结传递数值 code: #include <stdio.h> void deliveryData(int data) { data = d...
    99+
    2022-11-12
  • Python函数值传递、引用传递、形式参数和实际参数的区别是什么
    本篇内容主要讲解“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”...
    99+
    2023-06-30
  • Python函数值传递引用传递及形式参数和实际参数的区别
    通常情况下,定义函数时都会选择有参数的函数形式,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。 在使用函数时,经常会用到形式参数(简称“形参&rdqu...
    99+
    2022-11-11
  • vue中传参params和data的区别是什么
    今天小编给大家分享一下vue中传参params和data的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、使用d...
    99+
    2023-06-30
  • Python中引用传参的四种方式分别是什么
    这篇文章将为大家详细讲解有关Python中引用传参的四种方式分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。引用传参一:>>> a = ...
    99+
    2023-06-22
  • C++中左值和右值的区别是什么
    今天给大家介绍一下C++中左值和右值的区别是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。左值右值定义:左值指的是既能够出现在等号左边也能出现在等号右边的...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作