关于调用函数的实参问题

 #include<stdio.h>
 int add(int x,int y)
{
return x+y;
}
int main()
{
int i=1,j=2;
int x=add(i,j);
return 0;

}


相应的汇编代码为

main:
.LFB1:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $1, -12(%ebp)
movl $2, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl -12(%ebp), %eax
movl %eax, (%esp)
call add
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
本来我是调用add(i,j)结果汇编代码里面是

movl $1, -12(%ebp)   先存变量

movl -12(%ebp), %eax将变量的值赋给寄存器eax

movl %eax, (%esp)  将eax的值赋给esp所指向的地址


 #include<stdio.h>
 int add(int x,int y)
{
return x+y;
}
int main()
{
int i=1,j=2;
int x=add(1,2);
return 0;

}


main:
.LFB1:

pushl %ebp
        movl %esp, %ebp
        subl $24, %esp
movl $1, -12(%ebp)
movl $2, -8(%ebp)
movl $2, 4(%esp)
movl $1, (%esp)
call add
movl %eax, -4(%ebp)
movl $0, %eax
leave
        ret

相反,这里不需要,因为调用函数的时候是直接将实参放进函数表达式中去的


<think>好的,我现在需要解释调用函数实参和形的区别和联系。首先,我得回忆一下自己学过的编程知识,确保概念正确。 实参和形函数调用中的基本概念。形是在定义函数声明的变量,用于接收传入的值。而实参则是调用函数实际传递给形的值。比如,定义一个函数add(a, b),这里的a和b就是形;当调用add(3,5),3和5就是实参。 接下来,我需要理清它们之间的关系。形是函数内部的局部变量,作用域只在函数体内。实参可以是常量、变量、表达式或者函数返回值。传递方式可能有值传递和引用传递,不同编程语言处理方式不同,这里可能需要简单说明,但用户的问题比较基础,可能不需要深入。 还要注意实参和形的数量和类型必须匹配,否则会出错。例如,如果函数需要两个数,调用只给一个就会报错。类型不匹配的话,有些语言会隐式转换,有些则直接报错。 可能存在的误区是,用户容易混淆实参和形,或者不理解传值传引用的区别。比如,在Python中,数传递是按对象引用传递的,修改可变对象和不可变对象的效果不同。但这个问题可能超出了当前的范围,用户可能只需要基本概念。 需要举例子说明。比如定义函数用形,调用传入实参。可以用一个简单的加法函数作为例子,这样用户容易理解。 结构上,先分别介绍实参和形的定义,然后说明它们的关系,最后通过例子巩固。注意使用中文,避免术语混淆,保持口语化但准确。 检查是否满足系统级指令:行内公式用$...$,独立公式用$$...$$,结构清晰,语法正确。用户的问题可能不涉及数学公式,但如果有变量名或表达式,可能需要用LaTeX,比如函数名中的数。 最后,确保回答真实可靠,没有错误。可能需要再次确认实参和形的定义,确保没有记混。</think>在编程中,理解函数调用的**实参**(实际数)和**形**(形式数)至关重要。以下是逐步说明: --- ### 1. **形(形式数)** - **定义**:形是函数定义声明的变量,用于接收外部传入的值。 - **特点**: - 作用域仅限于函数内部。 - 本质是占位符,无具体值,直到函数被调用接收实参。 - **示例**: ```python def add(a, b): # a和b是形 return a + b ``` --- ### 2. **实参(实际数)** - **定义**:实参调用函数传递给形的具体值或表达式。 - **特点**: - 可以是常量、变量、表达式或函数返回值。 - 必须与形的数量和类型匹配(部分语言允许隐式转换)。 - **示例**: ```python result = add(3, 5) # 3和5是实参 ``` --- ### 3. **实参与形的关系** - **传递方式**: - **值传递**:实参的值复制给形,修改形不影响实参(适用于基本数据类型)。 - **引用传递**:实参的引用(内存地址)传给形,修改形会影响实参(适用于对象、数组等)。 - **匹配规则**: - 顺序需一一对应,例如 `add(3,5)` 中,`3` 对应形 `a`,`5` 对应 `b`。 - 部分语言支持关键字数(如Python),允许按名称指定数: ```python add(a=3, b=5) # 明确指定形名 ``` --- ### 4. **示例分析** - **代码片段**: ```python def multiply(x, y): # x和y是形 return x * y num1 = 2 num2 = 4 product = multiply(num1, num2) # num1和num2是实参 ``` - **执行过程**: 1. 调用 `multiply(num1, num2)` 实参 `num1`(值为2)和 `num2`(值为4)传递给形 `x` 和 `y`。 2. 函数内部计算 `x * y`,返回结果 `8`。 --- ### 5. **常见误区** - **混淆修改形实参**: - 若形是基本类型(如整数),函数内修改形不影响实参。 - 若形是引用类型(如列表),修改其内容会影响实参。 - **数数量不匹配**: - 若调用实参数量与形不一致,会触发错误(例如 `TypeError`)。 --- ### 总结 | 概念 | 定义 | 阶段 | 作用域 | |------|---------------------|------------|------------| | 形 | 函数定义的占位符 | 函数定义 | 函数内部 | | 实参 | 调用传递的具体值 | 函数调用 | 函数外部 | 通过明确区分实参与形,能更清晰地理解函数的数据流动和封装逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值