我想知道值传递的过程是什么……
c语言吧
全部回复
仅看楼主
level 6
值传递是实参复制一个实参副本传给形参还是实参直接赋值给形参?搜索了好久都找不到我想要的……
2020年04月03日 09点04分 1
level 6
顶
2020年04月03日 09点04分 2
level 11
复制,对比形参为指针类型
2020年04月03日 09点04分 3
level 5
复制。有一个典型的例题。
2020年04月03日 09点04分 4
请问复制的副本占内存的吗?
2020年04月03日 09点04分
@飘飘欲仙👀 调用的时候占用,调用完成后释放
2020年04月03日 09点04分
@骑驴过大海♬ 那请问传指针的时候也是把实参的地址复制一份传递给形参吗?
2020年04月03日 09点04分
@飘飘欲仙👀 指针就是地址。相当于传过去后共用一组地址。
2020年04月03日 09点04分
level 5
2020年04月03日 09点04分 5
吧务
level 14
在x86中,进入函数前,会将所有实参的值复制一份,放到返回地址之前,作为形参。进入函数以后,沿着当前栈基址倒着往回找就可以找到存放的形参。
2020年04月03日 09点04分 6
传指针的话,也是复制一份实参的地址吗?
2020年04月03日 09点04分
@飘飘欲仙👀 传任何东西都是值传递,C语言里只有值传递。
2020年04月03日 09点04分
@GTA小鸡 那c++里面的值传递也是这样吗?
2020年04月03日 09点04分
2020年04月03日 09点04分
level 15
传参数进函数,约等于在函数内定义形参,并用对应参数进行初始化。也就是说,函数被调用时,形参是有对应独立空间来存储值的(不一定是内存)。
2020年04月03日 09点04分 7
1.用来初始化形参的应该不是实参原数据吧? 2.如果不在内存中储存还能在哪储存?
2020年04月03日 09点04分
@飘飘欲仙👀 1. 什么意思?数据肯定是一模一样的,这个不用担心,除非两者的类型不同。2. register 关键字修饰形参了解一下。当然这并不绝对,你要做的仅仅是了解 C 是按值拷贝实参的,其他都不用管。
2020年04月03日 09点04分
@aaaaaaa421 我第一个想问的是用来初始化形参的是实参的拷贝吗?就是说它与实参一模一样,但是与实参不是同一个数据。
2020年04月03日 10点04分
@飘飘欲仙👀 是实参本身,不这么做哪来实参的拷贝?
2020年04月03日 10点04分
level 5
在栈中开辟相同大小的内存空间存储复制过来值
2020年04月03日 11点04分 9
是这样吗:调用函数时,实参进行拷贝,此时会在栈中分配一个内存来储存拷贝的实参,然后把拷贝的实参赋值给形参,函数执行完后释放拷贝的实参
2020年04月03日 11点04分
函数执行完毕,将函数内开辟的内存空间回收
2020年04月03日 11点04分
@芦苇一心@ 好的,谢谢大佬
2020年04月03日 11点04分
level 11
调用函数前先计算实在参数的值,并将这些实在参数的值一一推到栈中(栈是内存的一段特殊区域,以后进先出的方式工作,一般用来传递函数调用的参数及返回地址等。注意,这些进栈的实参的值此时所占的栈上的内存单元其实就是形式参数),然后被调用的函数的代码就直接访问这些值所在的单元(也就是形式参数)进行函数内部的执行处理。传值的时候进栈的是实在参数的值,传地址的时候,进栈的是实在参数的地址而已(此时被调用函数取出栈中的地址,然后通过地址再取数进行处理)。这一过程可以通过将你的C语言程序生成的exe文件进行反汇编,然后查看对应的汇编代码,从而看得清清楚楚,明明白白。所以从某种角度来说,不懂汇编的人就不能说懂C语言,因为C语言其实就是计算机底层硬件的简单抽象,所以建议想要深入理解C语言的那些概念和机制的学习者,在学完C语言之后,最好学学汇编语言、计算机组成原理以及操作系统之类的核心课程。
2020年04月03日 11点04分 10
我想问一下那个推到栈中的实参是原本的实参还是拷贝后的实参?
2020年04月03日 12点04分
level 11
实在参数如果是单独的变量,则实在参数有自己独自的内存空间(全局变量和static修饰的静态局部变量在全局数据段中,局部变量在栈上分配的内存单元中),如果是表达式,则没有对应的存储单元,在函数调用前,先计算实在参数的值(实在参数为单独变量,则取其值;实在参数为表达式,则先计算其值),然后将该值推到栈中(该值就在栈上占有存储单元,此时这个存储单元的抽象就是形式参数),然后被调用函数中的执行语句就从栈上取出形式参数所在单元的值进行计算处理。所以从这个意义上,传值就是拷贝实在参数的值,形式参数其实就是实在参数的副本,你在被调用函数中修改了这个副本,对原来的实在参数根本没有任何影响(因为它们根本就不是一个存储单元)。7楼说得准确,偶尔也有不通过栈传值而是通过CPU中寄存器传值的情况(这时候形式参数就是寄存器的抽象)。
2020年04月03日 12点04分 11
当然是实在参数的值入栈,实在参数在某个固定的内存单元,一旦分配,没法挪动的(所以入栈的只是实在参数的值,不可能把实在参数本身入栈),只能复制其值到函数调用的栈中(这时候新分配的内存单元就是形式参数)。你想想,这样直接将实在参数的值拷贝到形式参数中效率是最高的。
2020年04月03日 22点04分
所以说实参一开始根本就不会去拷贝一个新的实参再去进行初始化,而是直接就传入函数对形参进行初始化,这样理解对吗?
2020年04月03日 12点04分
@飘飘欲仙👀 可以这样理解。
2020年04月03日 12点04分
@初学C入门 我还想问一下压栈只是把实参变量的值压入栈中吗?(就是说实参变量没有压栈,例如:int a = 1;只是把1压入,没有把a压入)
2020年04月03日 14点04分
1