首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当传递给一个预期的引用函数时,取消引用一个指针会创建一个副本,为什么?

当传递给一个预期的引用函数时,取消引用一个指针会创建一个副本的原因是为了确保在函数内部对指针所指向的数据进行操作时不会影响到原始数据。

当我们将一个指针作为参数传递给一个引用函数时,函数内部可以通过取消引用该指针来访问和操作指针所指向的数据。取消引用指针即意味着获取指针所指向的实际数据值。

在函数内部,为了避免对原始数据进行修改,通常会创建一个副本来存储取消引用后的数据。这样做的好处是,即使在函数内部对副本进行修改,也不会影响到原始数据的值。

这种方式可以确保函数内部的操作不会对原始数据造成意外的修改,从而提高代码的可靠性和安全性。

需要注意的是,创建副本可能会增加内存的使用量,特别是在处理大型数据结构时。因此,在使用取消引用指针创建副本时,需要权衡内存使用和代码效率之间的平衡。

总结起来,取消引用一个指针会创建一个副本的目的是为了确保在函数内部对指针所指向的数据进行操作时不会影响到原始数据,从而提高代码的可靠性和安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言函数参数是如何传递

开始a,b值为10,20,而最终还是同样值。 为什么呢?...因为函数参数在传递时候,都是原数据副本,也就是说,swap内部使用a和b只是最初始a和b一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始a和b值。...为什么又有值,又有指针 看到这里,不知道你是否疑惑,为什么函数传递参数时候,一会是值,一会是指针呢?为什么指针就能改变参数值呢?实际上,C语言里,参数传递都是值传递!...我们再通过图来理解前面为什么指针就可以交换a,b值: 指针 从图中可以看出,虽然传递给函数是指向a和b指针副本,但是它副本同样也是指向a和b,因此虽然不能改变指针指向,但是能改变参数a...我们还是利用前面所知来分析,由于传递给getMemory函数参数都是一个副本,因此函数p也是外部p一个副本,因此即便在函数内部,将p指向了一块新申请内存,仍然不会改变外面p值,即p还是指向NULL

4.1K11

函数参数值和指针有什么区别?

因为函数参数在传递时候,都是原数据副本,也就是说,swap内部使用a和b只是最初始a和b一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始a和b值。...为什么又有值,又有指针 看到这里,不知道你是否疑惑,为什么函数传递参数时候,一会是值,一会是指针呢?为什么指针就能改变参数值呢?实际上,C语言里,参数传递都是值传递!...从图中可以看出,虽然传递给函数是指向a和b指针副本,但是它副本同样也是指向a和b,因此虽然不能改变指针指向,但是能改变参数a和b指向内容,即改变原始a和b值。...我们还是利用前面所知来分析,由于传递给getMemory函数参数都是一个副本,因此函数p也是外部p一个副本,因此即便在函数内部,将p指向了一块新申请内存,仍然不会改变外面p值,即p还是指向NULL...getMemory 总结 本文总结如下: 函数参数都是原数据副本”,因此在函数内无法改变原数据 函数中参数都是值,指针本质上也是值 如果想要改变入参内容,则需要该入参地址(指针引用都是类似的作用

3K30

java中参数传递-值传递、引用传递

参数可以是对象引用,而 Java 应用程序是按值传递对象引用。 Java 应用程序中变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法,处理这两种类型方式是相同。...两种类型都是按值传递;没有一种按引用传递。 按值传递和按引用传递。按值传递意味着一个参数传递给一个函数函数接收是原始值一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。...按引用传递意味着一个参数传递给一个函数函数接收是原始值内存地址,而不是值副本。因此,如果函数修改了该参数,调用代码中原始值也随之改变。...1、对象是按引用传递 2、Java 应用程序有且仅有的一种参数传递机制,即按值传递 3、按值传递意味着一个参数传递给一个函数函数接收是原始值一个副本 4、按引用传递意味着一个参数传递给一个函数...这说明s2和s是同一个对象。   这里有一点要澄清是,这里传对象其实也是值,因为对象就是一个指针,这个赋值是指针之间赋值,因此在java中就将它说成了引用。(引用是什么?不就是地址吗?

4.7K20

Java学习笔记(2)——数据类型

java表面上看起来没有指针,但它引用其实质就是一个指针。...也就是说,我们在调用一个需要传递参数函数,传递给函数参数并不是我们进去参数本身,而是它副本。说起来比较拗口,但是其实原理很简单。...我们可以这样理解: 一个有形参函数别的函数调用它时候,必须要传递数据。比如swap函数,别的函数要调用swap就必须两个整数过来。...例子 可以看到,我们把p1进去,它并没有被替换成新对象。因为change函数操作不是p1这个引用本身,而是这个引用一个副本。...你依然可以理解为,主函数将p1复制了一份然后变成了chagne函数形参,最终指向新Person对象是那个副本引用,而实参p1并没有改变。 再来看一个例子: ? 例子2 这次为什么就改变了呢?

60130

你们不要再吵了! Java只有值传递..

有学过c语言同学应该很清楚,这里借助c语言中指针”打个比喻。 引用类型str就相当于一个指针(旗子),插在了一个房子门口。...外部对这个变量进行修改时,lambda内部(只有副本)是无法感知到这个变量修改。...我们只是将实参传递给了方法形参,将cnt值复制一份,赋值给形参val所以,函数内对形参操作完全不会影响到实参真正存活区域!而伴随着函数调用结束,形参区域和其内局部变量也会被释放。...实参传递给形参,形参其实用就是实参本身(而不再单纯只是拷贝一份副本出来了),该形参变量被修改时,实参变量也会同步修改。...经评论区小伙伴补充,不用&,@这种取地址操作符也可以引用传递,参考C#ref、out和in关键字。 而c,Pascal,go这些是可以引用

37630

指针变量值和

指针引用 int v = 1; int *p = &v;' int *&rp = p; &说明r是一个引用。*确定r引用类型是一个指针。...、引用区别和联系 值:实参拷贝传递给形参。...无论值还是指针函数都会生成一个临时变量,但引用时,不会生成临时变量, ,只可以引用值而不可以改变值,但引用时,可以改变值, 指针,只可以改变指针所指内容,不可以改变指针本身,但指针引用时...,既可以改变指针所指内容,又可以改变指针本身, 引用传递函数参数,在内存中并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本...因此,参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。 参考书籍《C陷阱与缺陷》

2K30

Java值调用

值传递:基本类型变量在被传递给方法,传递是该变量值(即复制自己值传递给方法)。 引用传递:引用类型变量在被传递给方法, 传递是该变量引用(即自己所指向内存地址)。...如下,在调用change()方法实参为i,程序执行到change(i)这一行,i是实参,这时i就要被求值了,求出i值即4传给change()方法;change()形参a拿到是实参i值,是一个拷贝副本...引用调用(Call by reference) 在“引用调用”求值中,传递给函数是它实际参数隐式引用而不是实参拷贝。通常函数能够修改这些参数(比如赋值),而且改变对于调用者是可见。...这不是一种不同求值策略(语言本身还是值调用)。它有时被叫做“地址调用”(call by address)。这可能让人不易理解。在C之类不安全语言里引发解引用指针之类错误。..., b通过创建指针实现引用传递,c是按值传递指针 //b and x are changed return 0; } 共享对象调用(Call by sharing) 此方式由Barbara

3.5K20

指针变量值和

指针引用 int v = 1; int *p = &v;' int *&rp = p; &说明r是一个引用。*确定r引用类型是一个指针。...、引用区别和联系 值:实参拷贝传递给形参。...无论值还是指针函数都会生成一个临时变量,但引用时,不会生成临时变量, ,只可以引用值而不可以改变值,但引用时,可以改变值, 指针,只可以改变指针所指内容,不可以改变指针本身,但指针引用时...,既可以改变指针所指内容,又可以改变指针本身, 引用传递函数参数,在内存中并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本...因此,参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。 参考书籍《C陷阱与缺陷》

2.7K40

Go 语言基础入门教程 —— 函数篇:函数参和返回值

按值参和引用参 Go 语言默认使用按值参来传递参数,也就是传递参数一个副本函数接收该参数后,可能在处理过程中对参数值做调整,但这不会影响原来变量值,我们还是以上篇教程 add 函数为基础作为示例...,这两个变量拷贝出一个副本赋值给 a、b 变量作为参数,因此,在 add 函数中调整 a、b 变量值并不会影响原变量 x、y 值,所以上述代码输出是: add(1, 2) = 8 如果你想要实现在函数中修改参数值可以同时修改原变量...,需要通过引用参来完成,此时传递给函数参数是一个指针,而指针代表是原变量地址,修改指针指向值即修改变量地址中存储值,所以原变量值也会被修改(这种情况下,传递是变量地址值拷贝,所以从本质上来说还是按值参...: add(2, 6) = 8 在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样引用类型 默认使用引用参(即使没有显示指出指针,类似 PHP...中,我们需要对返回结果做各种判断,才能实现预期效果,在 Go 语言中,只需要通过在返回值中多返回一个错误信息即可: func add(a, b *int) (int, error) { if

1.3K30

C++: 21---引用指针

(2)引用不可以为空,创建时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。...调用test函数 运行结果为: 0x6afecc 1 指针p为NULL 在main函数中声明了一个指针p,并赋值为NULL,调用test函数,事实上传递也是地址,只不过传递 是指地址。...指针作 为参数进行传递,也是将实参一个拷贝传递给形参,即上面程序main函数p何test函数中使用p不 是同一个变量,存储2个变量p单元也不相同(只是2个p指向同一个存储单元),那么在test...所以在引用进行参数传递,事实上传递是实参本身而不是拷贝副本。所以在上述要达到同时修改指针 目的的话,就得使用引用了。...如果是我,我更喜欢选择引用,因为免去了指针判空(我比较懒),最主要是还是省空间,因为如果参数比较多,指针,相当于要给当前函数入口地址分配栈空间时候,你指针参数要分配8字节空间,这样重复调用此函数可能产生大量内存碎片

70120

C语言中函数参数传递三种方式

C语言中函数参数传递三种方式 (1)值,就是把你变量值传递给函数形式参数,实际就是用变量值来新生成一个形式参数,因而在函数里对形参改变不会影响到函数变量值。...因而如果int,char等固有类型,而是你自己定义类或结构等,都建议指针引用,因为他们不会创建对象。...2)指针传递: 形参为指向实参地址指针对形参指向操作,就相当于对实参本身进行操作 3)引用传递: 形参相当于是实参“别名”,对形参操作其实就是对实参操作,在引用传递过程中...另外一种用法是:一个函数实际需要返回多个值,而只能显式返回一个,可以将另外需要返回变量以指针/引用递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后变量,也相当于一个隐式返回值传递吧...2、给函数传递大型对象 大型对象被传递给函数,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象 副本,也就是参数传递,对象无须复制。

2.1K10

【C++】This指针和复制构造函数

复制构造函数一种特殊构造函数,在创建一个对象将其他对象作为参数, 编译器将会调用复制构造函数。不提供使用默认构造函数。默认构造函数内部各个成员变量赋值。...创建之后,新对象是老对象副本,二者值相同。但具有不同存储空间。...CTime(CTime& time);//使用类名对象作为参数,引用 调用复制构造函数时机: 在什么情况下使用复制构造函数 1.以其他对象作为参数创建新对象。...比如:创建一个对象时候,把原来一个对象作为参数传递给对象作为构造函数 CTime time; CTime time2(time);//自动执行复制构造函数,复制成员等 CTime::...我们使用类对象作为函数参数时候,以及返回一个对象时候,代价是很大, 因为伴随着对象创建和销毁,还伴随着复制构造函数调用, 所以一般使用引用来规避这种代价!

81120

c++中ref作用

C++11 中引入 std::ref 用于取某个变量引用,这个引入是为了解决一些参问题。我们知道 C++ 中本来就有引用存在,为何 C++11 中还要引入一个 std::ref 了?...th,调用带有两个参数 threadFunc 函数一个是 std::string 对象 str 引用,另一个是整数 a。...总结std::ref 是一个 C++ 标准库函数模板,它将对象引用转换为可复制可调用对象。std::ref 用于将对象引用递给函数或线程等可调用对象参数。...如果不使用 std::ref,那么函数或线程会将对象副本递给可调用对象参数,这可能导致无法预期结果,因为对该副本修改不会影响原始对象。...总之,std::ref 作用是将对象引用转换为可复制可调用对象,使得在函数或线程等可调用对象中引用原始对象,而不是其副本。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

29210

【c++入门】引用,内联函数,auto

,在参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用值作为参数或者返回值类型,效率是非常低下,尤其是参数或者返回值类型非常大,效率就更低...关键点在于没有产生任何拷贝,函数直接在原对象上工作 在本例中,TestFunc2被调用,并且以A&(结构体A引用)作为参数,它实际上是直接操作原有的对象a,而不是创建一个拷贝。...对于 func 函数,它栈帧将包含局部变量 a 存储空间 值返回基本原理 func 函数通过 return a; 返回 a ,实际上返回是 a 值一个副本,而不是 a 自身。...这个返回值副本通常是通过寄存器传递给函数调用者,在 main 函数中, int ret = func(); 一句捕获了 func 返回 a 副本,并将其存储在 main 局部变量 ret 中。...*p = &a; auto& r = a; 它推导是十分灵活 用auto声明指针类型,用auto和auto*没有任何区别,但用auto声明引用类型则必须加& 比如我们想创建一个函数指针

9310

C++:19---this指针

程序被编译之后,此成员函数地址已经确定 我们常说,调用类成员函数,会将当前对象this指针递给成员函数: 上面我们说了,一个成员函数只定义了一份,所有对象共用这个成员函数体 那么如何区分哪个对象调用此函数呢...这就是this指针作用,每次对象调用成员函数,将this指针(对象首地址)传递给成员函数,然后在函数体内对类数据成员访问,就会被转换为“this->数据成员”形式 如果成员函数内部没有访问对象任何数据成员...结果分析: 此处我们创建一个对象,但是访问后面越界之后仍然可以访问成功 上面我们说过了,如果一个成员函数没有操作任何类数据成员,因此这个成员函数与全局函数类型,调用之后都会打印“hello!”...但是如果把14行代码取消注释怎么样呢?...结果分析: 此处我们成员函数访问了类数据成员,那么每次打印数据都会通过this指针调用 但是此处我们只创建一个对象,所以调用pMyClass[1]和pMyClass[10000000]越界了

51510

C++:07---this指针

程序被编译之后,此成员函数地址已经确定 我们常说,调用类成员函数,会将当前对象this指针递给成员函数: 上面我们说了,一个成员函数只定义了一份,所有对象共用这个成员函数体 那么如何区分哪个对象调用此函数呢...这就是this指针作用,每次对象调用成员函数,将this指针(对象首地址)传递给成员函数,然后在函数体内对类数据成员访问,就会被转换为“this->数据成员”形式 如果成员函数内部没有访问对象任何数据成员...结果分析: 此处我们创建一个对象,但是访问后面越界之后仍然可以访问成功 上面我们说过了,如果一个成员函数没有操作任何类数据成员,因此这个成员函数与全局函数类型,调用之后都会打印“hello!”...但是如果把14行代码取消注释怎么样呢?...结果分析: 此处我们成员函数访问了类数据成员,那么每次打印数据都会通过this指针调用 但是此处我们只创建一个对象,所以调用pMyClass[1]和pMyClass[10000000]越界了

38420

清源正本,鉴往知来,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中引用类型是否进行引用传递EP18

引用类型     首先,Go lang基本数据类型是值类型,比如整数、浮点、字符串、布尔、数组及错误类型,它们本质上是原始类型,也就是不可改变,所以对它们进行操作,一般都会返回一个创建值,所以把这些值传递给函数...,其实传递一个拷贝副本,这一点,基本没啥争议。    ...为什么我们使用字典实参,从来都不加*?     ...本质上,我们可以理解字典作为参数传递方式是值传递,只不过引用类型传递一个指向底层数据指针,所以我们在操作时候,可以修改共享底层数据值,进而影响到所有引用到这个共享底层数据变量,这也就是为什么字典在函数内操作可以影响原对象原因...结语     引用类型之所以可以引用,是因为我们创建引用类型变量,其实是一个标头值,标头值里包含一个指针,指向底层数据结构,当我们在函数中传递引用类型,其实传递是这个标头值副本,它所指向底层结构并没有被复制传递

29410

值传递和引用传递

按值传递:一个参数传递给一个函数时候,函数接收是原始值一个副本,因此,如果函数修改了该参数,仅仅修改是参数副本,而原始值保持不变。...按引用传递一位置一个参数传递给一个函数时候,函数接收是原始值内存地址,而不是值副本。因此,如果函数修改了该参数,调用代码中原始值也随之改变。   ...1.对象是按照引用传递;   2.java中仅存在一种参数传递机制,即按值传递;   3.按值传递意味着一个参数传递给一个函数时候,函数接收是原始值一个副本;   4.按引用传递意味着一个参数传递给一个函数时候...,函数接收是原始值内存地址,而不是值副本。...虽然这里看做是“引用传递”, 但引用传递其实也是值,因为对象就是一个指针,这个赋值是在指针之间赋值,因此在java中将它称为引用

1.6K60

如何禁止函数值调用

代码编译运行环境:VS2012+Debug+Win32 ---- 按照参数形式不同,C++应该有三种函数调用方式:值调用、引用调用和指针调用。...对于基本数据类型变量作为实参进行参数传递,采用值调用与引用调用和指针调用效率相差不大。但是,对于类类型来说,值调用和引用调用之间区别很大,类对象尺寸越大,这种差别越大。...值调用与后面两者区别在于值调用在进入函数体之前,会在栈上建立一个实参副本,而引用指针滴啊用没有这个动作。建立副本操作是利用拷贝构造函数进行。...因此拷贝构造函数参数必须是一个引用一个指针。 (2)拷贝构造函数参数且通常情况下是const,但是const并不是严格必须。...作为实参以值传递方式传递给一个函数; c. 在函数体内返回一个对象,也会调用返回值类型拷贝构造函数; d. 需要产生一个临时类对象(类对象作为函数返回值创建临时对象)。

2.8K10

php引用值详解

与C语言中指针是有差别的.C语言中指针里面存储是变量内容在内存中存放地址 变量引用 PHP 引用允许你用两个变量来指向同一个内容 <?...$a=&test(); 方式得到才是函数引用返回 至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面。)...上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b; PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象副本,并希望原来对象改变不影响到副本 ....另外, php5中对于大数组传递,建议用 "&" 方式, 毕竟节省内存空间使用。 取消引用 当你 unset 一个引用,只是断开了变量名和变量内容之间绑定。这并不意味着变量内容被销毁了。...//下面再来个小插曲 php中对于地址指向(类似指针)功能 不是由用户自己来实现,是由Zend 核心实现,php中引用采用是“写拷贝”原理,就是除非发生写操作,指向同一个地址变量或者对象是不会被拷贝

5.2K20
领券