您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 值参 >

C++传值参数的小问题

发布时间:2019-07-02 07:45 来源:未知 编辑:admin

  请问 i 不是实参吗? i 的结果不是等于0了吗?那不是改变了吗? 为什么说实参本身没有改变呀?本人菜鸟 求大哥大姐解答下

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部书上说的意思是,i的值通过*ip=0;变成了0,但&i的值没有受到ip=0;而影响到,换句话说i的值改变了,但i的地址没有受ip=0;的影响而改变。

  原因是reset(传递给函数的是一个数值,这个数值是i的地址,函数用这个数值当成指针进行赋值,当函数将这个数值改变时,不会影响到调用者变量i的地址。更多追问追答追问请问下 i的地址为什么不会受ip=0而改变呀?

  还有,也就是说 实参&i 不变,只不过将数值换了下对吗?请问下 i的地址为什么不会受ip=0而改变呀?

  还有,也就是说 实参&i 不变,只不过将数值换了下对吗?追答请看调用过程:reset(是将变量i的地址入栈,这个地址被reset函数拿来使用,虽然reset将栈中的这个地址清0,但i的地址没有受影响,reset结束运行后,这个栈中的地址就被废弃了。

  reset在这个地址清0之前用这个地址将这个地址指向的单元进行赋值,因为此地址指向变量i的位置所以相当于修改了变量i的值。

  所以所谓实参,就是将变量的值压入堆栈,子程序再怎么折腾也是这个值,而这个值在使用后就没用了,在此例中&i只是提供了i的地址,子程序可以用这个地址去干活,但再怎样也无法修改i的地址。

  ip = 0; //这里是地址。好比换了一个房间,但是房间里东西没有变。。所以实参未被改变 ,

  还有.. &i 指的是i 的地址吗?追答可以改变呀,谁说不能改变。。const 制定的才不能改变。。。&i 这个只是取了一个别名而已。。什么都可以改变的。。 不过不能改变,你赋值了,会报错的。。

  伙计:先要清楚,reset(&i)中的i并不是“值传递”,而是“引用传递”。引用传递可以粗略地理解为把实参变量本身传递过去了,函数中操作这个“引用”就是在操作实参变量本身,所以会引起实参的永久性改变。而其他的函数参数传递,包括指针传递,传给函数的都是“值拷贝”,所以函数中对形参的所有操作都局限在“函数内部”,一旦函数返回,所有在函数内部的操作都失去效果。C++的函数的引用形参,就是为解决C函数的传值缺陷而诞生的……

  展开全部换种思路思考 ,或者从函数实际传参原理思考就简单了。由typedef特性可以将所有指针类 、引用类区个别名,引用可以看作会自动调用解引用操作并且指向不变的指针,除了数组的delete之外,一切特性都和struct差不多 ,而struct作为参数,隐藏实现细节,又是和基本类型的传值是一样的,即都是拷贝,对指针作为参数来说,任何对改指针的修改都是在修改一份传进来的拷贝,而解引用和下标操作都进行了运算,获取的对象都不是该指针,而是指针进行运算后所得到的对象。个人 觉得这样能更好的理解 函数参数修改的问题。

  i不是实参 &i 获取的i的地址才是实参,该值是一个临时值,所以实参没用被改变。追问我太笨了 T T

  那个输出的结果不是 表明 &i 和 i 最终都改变了吗? 也就是说实参被改变了...符号操作都可以看作函数,简单的、基本的符号操作可以看作汇编内联,而复杂的是函数内联或调用函数实现,&单目取址操作 返回 i的内存地址,这个返回值其实直接压栈作为函数参数传递了,这个被压入的值的来源叫做 实参,在reset函数内,保存发回地址等参数后将使用函数调用前的压入栈的值,这个值就是形参 ip。了解函数 实际传 参原理就很容易懂的,单单的给个名称定义附加一个生硬的规则的确很难懂。CC++这些基本原理还是要懂些好,JAVA等其它高级语言可以不管这些 被影藏的实现细节。

http://acetechpng.com/zhican/153.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有