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

结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?

很久没有写博了,今天一个同学在问结构变量的问题,问结构到底是传递值还是传递引用。查过MSDN的都知道,结构默认是传递值的,因此在方法内部,结构的值会被复制一份。...,以引用传递的结构变量,它的值被改变了: Struct Pont(X,Y) Test: call by value Point X=1,Y=2 call by ref Point X=2,Y=3 下面,...,元素的值被改变了,证明结构数组没有复制数组元素的值,依然是对数组的引用,上面的问题虚惊一场。...,等于是复制这个结构变量的值。...往往有时候,我们为了敲代码方便,少写几个字,便定义一个临时变量去引用原来的变量,而这种行为,对于操作结构变量,无疑是一个最大的坑,这个坑,你遇到过吗?

2.5K100

【C语言笔记】volatile关键字

编译器的优化 在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值; 当变量值在本线程里改变时,会同时把变量的新值copy...到该寄存器中,以便保持一致 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致; 当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致...员工 -- 原始变量地址 银行卡号 -- 原始变量在寄存器的备份 volatile例子 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。...ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的...如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

77060
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么Java中只有值传递【详解】

    :指的是在调用函数时,将实参拷贝一份赋值给函数的形参,对形参进行操作; 引用传递:指的是在函数调用时,将实参传递给函数,直接对实参进行操作; 天大的误解:传递的是基本数据类型就是值传递,传递的是引用数据类型就是引用传递...原始变量,原本的实参 // 此处省略函数调用 int y = x; // 新变量,形参,此时y的值就是1 y = 100; // 形参怎么改变,实参不会收到任何影响...b = new Student(); // 此时a和b指向的就不是一个对象了,对b进行任何操作,a所指向的对象都不会改变 // 引用传递:指的是在函数调用时,将实参传递给函数,直接对实参进行操作...你不是说值传递不改变实参吗,这不是改变了?!...这是最容易产生误解的地方了,值传递确实没有改变原始变量student,但是原始变量student存储的是new Student("訾博")对象的引用地址,当调用change()函数的时候相当于将引用地址赋值给了形参

    6710

    因为我的名字特殊大家都是用异样的眼光在看着我 04

    之前我们所学习的是叫做变量,你知道为什么叫做变量吗? 小媛:为什么? 小C:因为变量可以在程序运行时所存储的值可以进行改变。 小媛:嗯?不理解。 小C:你看下面这个代码。...改变后 i 的值是:"<<i; } 小媛:嗯,看懂了。...之后再存一个 100 到变量 i 中,此时 i 变量的内容会覆盖之前所存储的值,然后再输出,结果应该是第一次显示 25,第二次显示 100。 小C:是的,挺聪明,不错。下面就是这个代码运行的结果。...就在创建变量前在开头加了一个 const,这样就可以了? 小C:是的,是不是很简单? 小媛:经过之前的教训,我总感觉你在想坑我。...改变后 i 的值是:"<<i; } 小C:你的报错是不是这个样子的。

    35120

    C语言 | 每日基础(41)

    读者:为什么在调用 free() 之后指针没有变空?使用 (赋值, 比较) 释放之 后的指针有多么不安全?...阿一:当你调用 free() 的时候, 传入指针指向的内存被释放, 但调用函数的指针值 可能保持不变, 因为 C 的按值传参语义意味着被调函数永远不会永久改变参数的 值。...严格的讲, 被释放的指针值是无效的, 对它的任何使用, 即使没有解参照, 也可 能带来问题, 尽管作为一种实现质量的表现, 多数实现都不会对无伤大雅的无效指 针使用产生例外。...读者:当我 malloc() 为一个函数的局部指针分配内存时, 我还需要用 free() 明确的释放吗? 阿一:是的,记住指针和它所指向的东西是完全不同的。...局部变量在函数返回时 就会释放, 但是在指针变量这个问题上, 这表示指针被释放, 而不是它所指向的对 象。用 malloc() 分配的内存直到你明确释放它之前都会保留在那里。

    3133129

    CC++ volatile

    1.volatile的作用 定义为volatile的变量是说这变量可能会被意想不到地改变,即在你程序运行过程中一直会变,你希望这个值被正确的处理,每次从内存中去读这个值,而不是因编译器优化从缓存的地方读取...由于访问寄存器的速度要快过RAM(从RAM中读取变量的值到寄存器),以后只要变量的值没有改变,就一直从寄存器中读取变量的值,而不对RAM进行访问。...(2)在语句b=i;之前,已经通过内联汇编代码修改了i的值,但是i的变化却没有反映到b中,如果i是一个被多个任务共享的变量,这种优化带来的错误很可能是致命的。...跟踪汇编代码可知,凡是申明为volatile的变量,每次都是从内存中读取变量的值,而不是在某些情况下直接从寄存器中取值。...使在main函数中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致

    1.9K31

    “无状态”的那点事儿

    因为每次调用都不会在这个函数中保留数据, 调用完了就完了,每一次调用都是崭新的调用,并且第一次和第一百次之间没有任何关系。 因为那个函数不保存状态,所以无论是并发还是并行,都没有问题。 嗯,明白。...那这么说来,这个服务器也不会记录每次请求的是谁,只要执行这个'函数调用'就可以了。 你说说,这样的HTTP协议有什么好处?...,就不能再改变了, 我看到了那个add方法,它不是对现有对象的修改,而是返回了一个全新的对象。......... } 你误入歧途了,把无状态和无共享的实例变量画了等号,你想想,如果LoginController调用的userService 的方法也是类似 y=f(x), 会有线程安全问题吗?...无论是Controller还是Service都是纯函数调用而已。 但是如果确实需要共享的变量(并且多线程对该变量的操作互不依赖)该怎么办?

    50120

    useRef的用法总结

    initialValue被赋值给其返回值的.current对象可以保存任何类型的值:dom、对象等任何可变值ref对象与自建一个{current:‘’}对象的区别是:useRef会在每次渲染时返回同一个...ref对象,即返回的ref对象在组件的整个生命周期内保持不变。...自建对象每次渲染时都建立一个新的。ref对象的值发生改变之后,不会触发组件重新渲染。有一个窍门,把它的改变动作放到useState()之前。...useState和useRef在组件重新渲染时都不会重复执行,这里的区别是,useRef相当于在React的全局对象上挂载了一个变量,无论组件如何变化都不会影响这个变量,而这个变量的值发生变化也不会使组件渲染...useState,组件重新渲染,useState不会重复执行,useState的效果相当于在React的全局对象上挂载了一个变量,组件重新渲染,并不会造成变量的更新,而变量的值更新的话,一般通过setXXX

    1.1K00

    【Java面试系列】Java 基础常问面试题

    自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之前做的一个转化。比如:把 int 转化成 Integer,double 转化成 Double,等等。反之就是自动拆箱。...final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。...而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。...深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被 复制过的新对象,而不再是原有的那些被引用的对象,换言之,深拷贝把要复制的对象所引用的对象都 复制了一遍。...; 3)finally 是在 return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保 存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是

    59840

    关键字volatile正确理解和使用!

    ISR_2中断产生时,在main函数中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的...如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。...volatile的本质: 编译器的优化:在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。...当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。 volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人。

    62530

    C语言中volatile关键字的作用

    它只能做其它的优化。 2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。...ISR_2中断产生时,在main函数中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的...5.volatile的本质: 1> 编译器的优化 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。...当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

    1.1K30

    C语言中volatilekeyword的作用

    它仅仅能做其他的优化。 2>用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。...ISR_2中断产生时,在main函数中调用dosomething函数,可是,由于编译器推断在main函数里面没有改动过i,因此可能仅仅运行一次对从i到某寄存器的读操作,然后每次if推断都仅仅使用这个寄存器里面的...5.volatile的本质: 1> 编译器的优化 在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时...当变量在因别的线程等而改变了值,该寄存器的值不会对应改变,从而造成应用程序读取的值和实际的变量值不一致。...当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

    96510

    浅析Java中的final关键字

    在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。...当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了...2.被final修饰的引用变量指向的对象内容可变吗?   在上面提到被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?...5.关于final参数的问题   关于网上流传的”当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法外的变量“这句话,我个人理解这样说是不恰当的。...所以即使没有final修饰的情况下,在方法内部改变了变量i的值也不会影响方法外的i。

    99870

    浅析Java中的final关键字

    在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。...当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了...2.被final修饰的引用变量指向的对象内容可变吗?   在上面提到被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?...5.关于final参数的问题   关于网上流传的”当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法外的变量“这句话,我个人理解这样说是不恰当的。...所以即使没有final修饰的情况下,在方法内部改变了变量i的值也不会影响方法外的i。

    40510

    关于函数参数传递,80%人都错了

    还记得上一次关于变量作用域文章最后的问题吗?...或许在很多人的直观印象中,变量是一个容器;给变量赋值,就像是往一个存储的容器中填入一个数据;再次赋值就是把容器中的数据换掉。 然而, 在 Python 中,这种理解是不准确的!...体会下这两种设计的差异: · 前者,变量是一个固定的存在,赋值只会改变其中的数值,而变量本身没有改动。 · 后者,变量不存在实体,它仅仅是一个标签,一旦赋值就被设置到另一个物体上,不变的是那些物体。...每次给变量重新赋值,它就指向了新的地址,与原来的地址无关了。...当 x 在函数内部又被赋值为 3 时,就是把 x 又贴在了 3 这个对象上,与之前的 a 不在有关系。所以外部的 a 不会有任何变化。

    38330

    volatile在嵌入式系统中的用法

    精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1)....,会同时把变量的新值copy到该寄存器中,以便保持一致 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 当该寄存器在因别的线程等而改变了值...,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致 举一个不太准确的例子: 发薪资时,会计每次都把员工叫来登记他们的银行卡号;一次会计为了省事,没有即时登记,用了以前登记的银行卡号...ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此 可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的...如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

    1.6K20

    Python到底是引用传递还是值传递?网上大多数教程都讲错了

    还记得上一次关于变量作用域文章最后的问题吗?...或许在很多人的直观印象中,变量是一个容器;给变量赋值,就像是往一个存储的容器中填入一个数据;再次赋值就是把容器中的数据换掉。 然而, 在 Python 中,这种理解是错的!...体会下这两种设计的差异: · 前者,变量是一个固定的存在,赋值只会改变其中的数值,而变量本身没有改动。 · 后者,变量不存在实体,它仅仅是一个标签,一旦赋值就被设置到另一个物体上,不变的是那些物体。...每次给变量重新赋值,它就指向了新的地址,与原来的地址无关了。...当 x 在函数内部又被赋值为 3 时,就是把 x 又贴在了 3 这个对象上,与之前的 a 不在有关系。所以外部的 a 不会有任何变化。

    16620

    细说React中的useRef

    你可以会疑惑每次调用函数的like值是哪里来的,新的like值是由react提供,当我们调用setLike修改它的值的时候。react会带着新的值去重新运行函数进行再次渲染,保证渲染和输出一致。...这里有一个关键点,任意一次渲染周期(函数调用)的state/prop(直观来说就是like值)都不会随着时间改变,因为每次调用渲染函数中的like值都是一个常量(在各自的渲染函数作用域内)。...因为闭包的原因,当我们点击getLikeValue的时候获取的是当次渲染函数内部的like值,谨记每次渲染state和prop都是相互独立的(因为是各自函数作用域内的变量),每次独立渲染函数中的state...每次改变state/props造成函数组件重新执行,从而每次渲染函数中的state/props都是独立的,固定的。 注意这里的固定和独立这两个关键字。.../button> ); } 复制代码 按照之前的步骤操作,这个时候我们可以看到alert弹出的值就是最新的值。

    1.9K20

    浅尝辄止,React是如何工作的

    React使用了虚拟DOM,每次状态更新,React比较虚拟DOM的差异之后,再更改变化的内容,最后统一由React去修改真实DOM、完成页面的更新、渲染。"...这里每当Virtual DOM生成,都打印了出来,可以看到,它代表着真实DOM,而每次生成全新的,也是为了能够比较old dom和new dom之前的差别。...--某面试官 纯函数 从本质上讲,纯函数的定义如下:不修改函数的输入值,依赖于外部状态(比如数据库,DOM和全局变量),同时对于任何相同的输入有着相同的输出结果。...举个例子,下面的add函数不修改变量a或b,同时不依赖外部状态,对于相同的输入始终返回相同的结果。...如果你在reducer内部直接修改旧的state对象的属性值,那么新的state和旧的state将都指向同一个对象。因此Redux认为没有任何改变,返回的state将为旧的state。

    68830
    领券