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

为什么更改指针副本不会影响初始对象

更改指针副本不会影响初始对象的原因是因为指针副本和初始对象是两个独立的变量,它们分别保存着不同的内存地址。

在计算机中,指针是一个变量,它存储了一个内存地址,该地址指向另一个变量的位置。当我们创建一个指针副本时,实际上是将初始指针的值复制到了一个新的变量中,这个新的变量也是一个指针。

当我们通过指针副本来修改其指向的变量时,实际上是修改了指针副本所指向的内存地址中存储的值,而不是初始对象的内存地址中存储的值。因此,这种修改不会对初始对象产生任何影响。

这种机制在编程中非常有用,特别是在函数传递参数时。通过传递指针副本,我们可以在函数内部修改指针所指向的变量,而不需要返回修改后的值。这样可以提高程序的效率和灵活性。

总结起来,更改指针副本不会影响初始对象是因为它们分别保存着不同的内存地址,修改指针副本只会影响副本所指向的变量,而不会对初始对象产生任何影响。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(ECS):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ai
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  • 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云游戏引擎(GSE):https://cloud.tencent.com/product/gse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Immer使用指南

针对不可变的数据结构能够做到变更检测: 即如果对象的引用没有更改,则对象本身也没有更改。...当使用Immer时,只需要对 draft对象进行更改,draft对象会先记录用户的修改, 然后仅创建有变更的必要的属性副本不会影响原始对象。...冻结对象不会被轻易改变。 4. 深度更新轻而易举,不需要人工考虑其数据结构会被影响或者遗漏。 5. 使用简单,能使代码更简洁。 6. 对JSON补丁的一流支持 7....当然,其效果和深拷贝对象是非常类似的,和操作一个对象的完全复制体一样,修改 draft 的时候并不会影响原来的 baseState。 为什么不直接使用深拷贝呢?...这是因为,immer 在处理 draft的时候,如果没有变更,或者变更之后和原来一样就不会改变对象,其对象指针还是同一个。 那么如果 draft 内部处理的时候有变更呢?

1.7K20

C++_ ‘&‘ 引用详解

引用: 引用是对一个变量 或 对象(后期讲解) 取的别名, 当引用初始化为某个变量, 便可以使用该引用名称或变量名称来指向此变量. 1.引用的定义: 定义别名方式: 真名的类型 & 别名 = 真名...实参->形参 : 实参与形参之间是单向传递, 发生函数调用时, 实参会把值传给形参, 但形参的改变不影响实参 引用形参 : 引用形参和指针形参一样, 它们都可以改变实参的值 引用形参代码实现: #include...引用形参为什么可以改变实参的内容_关于形参内部表示形式: ?...引用与指针对比: 当引用作为函数参数时, 与指针作为函数参数效果相同, 但引用不会产生指向对象副本,节省时间和空间 理论来讲: 引用是一个别名,不占用内存(并不确切) 指针是一个变量, 一般占用**4...字节(与编译环境也有关)**来存储地址 引用在定义时就被初始化, 引用的对象不能改变, 而指针的指向可以更改, 像const常量指针 引用的变量在定义前必须初始化, 指针不需要, 并且指针还可以指向空地址

1.2K40
  • JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

    b中的值只是a中值的一个副本.所以这两个变量可以参与任何操作而不会相互影响。...1)引用类型的值是可以改变的 var o = {x:1}; o.x = 2; // 通过修改对象属性值更改对象 o.y = 3; // 再次更改对象,给它增加一个属性 var a = [1,2,3....引用类型保存在变量中的是对象在堆内存中的地址,所以,与基本数据类型的简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。...那么赋值操作后,两个变量都保存了同一个对象地址,而这两个地址指向了同一个对象。因此,改变其中任何一个变量,都会互相影响。...但是在操作完成后,临时对象就扔掉了,下次再访问时,会重新建立临时对象,当然对之前的临时对象的修改都不会有效。)。

    22010

    Go 指针与引用:值传递和址传递

    variable传递进函数的只是副本,他们都是在variable的副本上进行操作,并不影响 variable 的原本的值。...,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (5) 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了,从一而终。...(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。 以下示例程序中,k 被初始化为i 的引用。...如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。 还有一种情况,就是当你重载某个操作符时,你应该使用引用。 尽可能使用引用,不得已时使用指针。...1.值引用赋值 比如 a:=b,这样修改a.name=“ls”,不会影响到b.name,值引用是复制结构体,开辟一块新的内存空间, a只是b的一个副本,而不是指向b的引用。

    1.7K20

    【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    ☁️引用的概念 语法 : 类型& 引用变量名(对象名) = 引用实体; 从图中我们可以看出b不仅和a的值相同,地址也是一模一样!这是为什么?...(vs2022下不会立即空间清除) 但是如果加上了static修饰就会不一样,因为被static修饰的变量是静态变量,是放在静态区上的,而不是栈上,并且由于static修饰的静态的变量只能被初始化一次...传值的优点是简单、直观,不会对原始数据产生任何影响。但是,传值会导致参数的副本被创建,如果参数较大,传值的效率可能会比较低。 传引用的优点是效率高,因为不需要创建参数的副本。...通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大。 返回值的优点是简单、直观,不会对原始数据产生任何影响。...但是,返回值会导致结果的副本被创建,如果结果较大,返回值的效率可能会比较低。 返回引用的优点是效率高,因为不需要创建结果的副本。同时,返回引用可以直接修改原始数据,对原始数据产生影响

    18510

    常见c和cpp面试题目汇总(一)

    2、new为对象分配空间时,调用对象的构造函数,delete调用对象的析构函数 3、 既然有了malloc/free,C++中为什么还需要new/delete呢?...对象的动态类型可变,静态类型无法更改 2)静态绑定和动态绑定 静态绑定:绑定的是对象的静态类型,函数依赖于对象的静态类型,在编译期确定 动态绑定:绑定的是对象的动态类型,函数依赖于对象的动态类型,在运行期确定...调用拷贝构造函数的情形: 1)用类的一个对象初始化另一个对象的时候 2)当函数的参数是类的对象时,就是值传递的时候,如果是引用传递则不会调用 3)当函数的返回值是类的对象或者引用的时候 举例: #include...函数调用时,值的传递机制是通过“形参=实参”来对形参赋值达到传值目的,产生了一个实参的副本。即使函数内部有对参数的修改,也只是针对形参,也就是那个副本,实参不会有任何更改。...函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。 用引用作为返回值最大的好处就是在内存中不产生被返回值的副本。 但是有以下的限制: 1)不能返回局部变量的引用。

    1.3K31

    JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    但是 JavaScript 中就像前面所说,在JS 中,string 就是一种原始类型数据而不是对象类,所以是按值传递,所以在 setNewString 中更改 str 的值不会影响到外面。...共享传递 Stack Overflow上Community Wiki 对上述的回答是:对于传递到函数参数的对象类型,如果直接改变了拷贝的引用的指向地址,那是不会影响到原来的那个对象;如果是通过拷贝的引用...如果被调用函数更改了参数的值,它不会影响原始值,因为它存储在其他地方,它只处理一个副本。...具体来说,当你传递一个对象(或数组)时,你无形地传递对该对象的引用,并且可以修改该对象的内容,但是如果你尝试覆盖该引用,它将不会影响对象副本- 即引用本身按值传递: function replace...update 函数引用 ref 参数中的内存地址,并更改存储在存储器地址中的对象的key属性。 总结 根据我们上面看到的,我们可以说原始数据类型和引用数据类型的副本作为参数传递给函数。

    3.7K41

    C++类自动提供的特殊成员函数

    - 最后⼀种声明使⽤motto **初始化⼀个匿名对象**,并将新对象的地址赋给pstring指针。 每当程序⽣成了对象副本时,编译器都将使⽤复制构造函数。...静态函数(如num_strings)不受影响,因为它们属于整个类,⽽不是各个对象。 引例: 让程序准确地记录对象计数。...- 如果类中包含了**使⽤new初始化的指针成员**,应当定义⼀个复制构造函数,**以复制指向的数 据,⽽不是指针**,这被称为深度复制。复制的另⼀种形式(成员复制或浅复制)只是复制指针 值。...浅复制仅浅浅地复制指针信息,⽽不会深⼊“挖掘”以复制指针引⽤的结构。 赋值运算符: ANSI C允许结构赋值,⽽C++允许类对象赋值,这是通过⾃动为类重载赋值运算符实现的。...当 然,编译器开发⼈员通常不会花时间添加这样的⾏为。 如果成员本⾝就是类对象,则程序将使⽤为这个类定义的赋值运算符来复制该成员,但静态数据成员不受影响

    71110

    java杂谈之方法参数的前世今生

    我们还是应该从事物的本质去分析为什么基础类型方法内修改不会影响到外面,而引用类型就会影响。 要说明这些问题还是要从java内存模型说起,JVM内存可以简单划分为堆内存、栈内存。...与此类似,传入方法的实际参数的复制品,不管方法中对这个复制品如何操作,实际参数本身不会受到任何影响。...这时在change方法中a更改不会对main方法中a有任何影响。 ?...,此时change方法中的person变量只是保存了main方法中Person对象的 一个指针引用,这个引用也是指向main方法中的同一个Person对象,内存存储如下: ?...,在change方法中修改引用应该修改的同一个String对象为什么change方法修改后没有影响到main方法的String对象呢?

    44830

    golang学习笔记9:函数参数与返回值

    函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。...如果传递给函数的是一个指针指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。...(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值传递。) 几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。...defer 和追踪 关键字 defer 允许我们推迟到函数返回之后(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?...关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源。

    1.1K20

    深拷贝与浅拷贝

    在浅拷贝中,如果对象中存在指针成员变量,那么只会复制指针的值,而不会复制指针所指向的实际数据。 具体来说,浅拷贝仅复制指针的值,使目标对象和源对象共享相同的内存块。...深拷贝确保目标对象和源对象具有独立的数据副本,彼此之间不会共享数据。 具体来说,深拷贝会递归地复制对象的所有成员变量,包括基本类型和指针类型。...当遇到指针类型成员变量时,深拷贝会为目标对象分配新的内存空间,并将源对象指针所指向的实际数据复制到新的内存空间中。这样,即使源对象或目标对象修改了它们各自的数据,彼此之间不会相互影响。...,并将其初始化为other.data所指向的值,从而创建了一个新的数据副本。...这样,在对象的复制或赋值过程中,每个对象都拥有自己独立的数据副本,彼此之间不会相互影响

    12310

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

    为什么呢?因为函数参数在传递的时候,都是传原数据的副本,也就是说,swap内部使用的a和b只是最初始a和b的一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始的a和b的值。...调用swap前后 由于在swap中永远只是对a和b的副本进行操作,因此完全不影响原始的a和b的值。最终也不可能达到交换a和b的值的目的。 传指针 那么为解决上面的问题,我们知道,需要传指针。...为什么又有传值,又有传指针 看到这里,不知道你是否会疑惑,为什么给函数传递参数的时候,一会是传值,一会是传指针呢?为什么指针就能改变参数的值呢?实际上,C语言里,参数传递都是值传递!...也就是说,你认为的传指针也是传值,只不过它的值是指针类型罢了。 我们再通过图来理解前面为什么指针就可以交换a,b的值: ?...我们还是利用前面所知来分析,由于传递给getMemory函数的参数都是一个副本,因此函数内的p也是外部p的一个副本,因此即便在函数内部,将p指向了一块新申请的内存,仍然不会改变外面p的值,即p还是指向NULL

    3K30

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

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

    4.1K11

    「音视频直播技术」JNI编程常见问题

    运行时的行为依赖于返回的是实际数据的指针还是其副本: 0 实际:数组对象是非固定的。 复制:数据被复制回来。具有副本的缓冲区被释放。 JNI_COMMIT 实际:什么都不做。...具有副本的缓冲区被释放。 JNI_ABORT 实际:数组对象是非固定的。早期写入的数据不会被中止。 复制:具有副本的缓冲区被释放;对它的任何更改都会丢失。...例如,您可能需要得到一个数组,修改它,并将其传递给其他函数,然后丢弃更改。如果您知道JNI正在为您制作新的副本,则无需创建另一个“可编辑的”副本。...输出中可以看到如下信息: D AndroidRuntime: CheckJNI is ON 如果你是一台普通设备,你可以使用下面的命令 adb shell setprop debug.checkjni 1 这不会影响已经运行的应用程序...FAQ: 为什么FindClass找不到我的类?

    1.6K20

    C# 9.0 中的新增功能

    虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。 不可变的引用类型也有许多优点。...2、仅限 Init 的资源库 仅限 init 的资源库提供一致的语法来初始对象的成员。 属性初始值设定项可明确哪个值正在设置哪个属性。 缺点是这些属性必须是可设置的。...此属性不会影响 abstract 方法,它会影响为实现生成的代码。 这些功能在某些情况下可提高性能。 仅应在采用前后对这些功能进行仔细的基准测试之后使用它们。...进行此更改后,两个表达式无需从一个隐式转换到另一个,而是都可隐式转换为目标类型。 你可能不会注意到此更改。 你会注意到,某些以前需要强制转换或无法编译的条件表达式现在可以正常工作。...为代码生成器添加的两项功能是分部方法语法和模块初始化表达式的扩展。 首先是对分部方法的更改

    1.7K20

    编码篇-iOS程序中的内存分配 栈区堆区全局区等相关知识

    对象引用计数很大,为固定值不会变化,表示无限运行的retainCount,对其进行retain或release也不会影响其引用计数。...一个问题:为什么我们在定义NSString时使用Copy而不是 Strong strong和retain同义, weak和assign同义, 为什么要采用这种说法, 似乎是ARC出现后为了消除引用计数的观念而采用的做法...但是:集合对象的内容拷贝仅限于对象本身,对象元素仍然是指针拷贝。 九. 函数参数赋值 从函数调用的角度理解: 传值: 函数参数压栈的是参数的副本。...任何的修改是在副本上作用,没有作用在原来的变量上。 传指针: 压栈的是指针变量的副本。 当你对指针指针操作时,其值是指向原来的那个变量,所以对原来变量操作。 传引用: 压栈的是引用的副本。...符号表生成后就不会再改,因此指针可以改变其指向的对象指针变量中的值可以改),而引用对象则不能修改。 下面图就是反映传指针的逻辑 ? ?

    1.5K20

    Swift基础 结构和类

    注意 类的实例传统上被称为对象。然而,与其他语言相比,Swift结构和类的功能要接近得多,本章的大部分内容描述了适用于类或结构类型的实例的功能。因此,使用了更通用的术语实例。...新实例属性的初始值可以通过名称传递给成员初始化器: let vga = Resolution(width: 640, height: 480) 与结构不同,类实例不会收到默认的按成员初始化器。...然而,由于它们是单独的实例,将cinema的宽度设置为2048不会影响存储在hd中的宽度,如下图所示: 同样的行为也适用于枚举: enum CompassPoint { case north, south...此后更改currentDirection的值不会影响存储在rememberedDirection中的原始值的副本。 类是参考类型 与值类型不同,引用类型在分配给变量或常量或传递给函数时不会复制。...标准库提供了指针和缓冲区类型,如果您需要直接与指针交互,您可以使用这些类型,请参阅手动内存管理。

    8800

    C# 9.0新特性介绍

    虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。 值类型变量可保存值,因此在将值类型传递给方法时,会对原始数据的副本进行更改。 不可变的引用类型也有许多优点。...2、初始化属性Setter关键字(Init) 仅限 init 的资源库提供一致的语法来初始对象的成员。 属性初始值设定项可明确哪个值正在设置哪个属性。 缺点是这些属性必须是可设置的。...此属性不会影响 abstract 方法,它会影响为实现生成的代码。 这些功能在某些情况下可提高性能。 仅应在采用前后对这些功能进行仔细的基准测试之后使用它们。...进行此更改后,两个表达式无需从一个隐式转换到另一个,而是都可隐式转换为目标类型。你可能不会注意到此更改。你会注意到,某些以前需要强制转换或无法编译的条件表达式现在可以正常工作。...此更改意味着 foreach 与其他基于模式的构造(例如异步模式和基于模式的析构)一致。实际上,此更改意味着可以为任何类型添加 foreach 支持。在设计中,应将其限制为在枚举对象有意义时使用。

    2K20

    ECMA-262-3深入解析第八章:评估策略

    这里参数的值是传入对象的复制。函数内部的修改不会影响外面传递的对象。技术上,运行时分配新的内存块,复制传递对象的所有内容到里面,接下来函数可以使用来自新地址的新对象。...这个引用副本与形式参数相关联,并且就是形参的值。 在这种情况,重新分配新值不会替换原始对象(正如引用策略所做的那样)。...通过共享与指针(By sharing and pointers) 关于C/C++,这种策略与通过指针传递类似。仅在C语言中,仍然可以取消引用指针并从外部更改对象。...但是,为指针重新分配一个值仅仅只是把它重新绑定到一个小的内存块中,而不影响旧的内存块。仍然可以使用指针修改原始对象的属性。...这也允许在函数参数与外界之间共享对象(即函数可以修改对象的字段),但是重新分配仅更改指针本身,而不会影响外面的对象。该数据类型甚至称为shared_ptr.

    94710

    Kotlin | 关于 Lazy ,你应该了解的这些事

    作用也相对直接,如果我们有某个对象或字段,我们可能只想使用时再初始化,此时就可以先声明,等到使用时再去初始化,并且这个初始化过程默认也是线程安全(不特定使用NONE)。...而线程内部的操作过程也主要是以工作内存为主,在工作内存中的更改会在后续才会刷新到主存,而这个刷新时机是 不定 的,也就是说在多线程情况下,很可能A线程的更改,B线程那边此时无法及时得知。...如果此时线程A要修改变量sum,同样也是先对工作内存中的副本更改,然后再刷新到主存里,但至于什么时候写入主存中,无法保证。...,那么对GC的压力就有很大的影响了。...PUBLICATION 线程安全 但是相比前者,你可以接受 你的初始化函数可能被调用多次 ,但并不影响你最终的使用,因为只有第一个初始化结果的才会被返回,并不影响你的逻辑,所以一般情况下,如果不在意上述问题

    1.3K40
    领券