打印

函数的形参和实参

[复制链接]
1483|83
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
phoenixwhite|  楼主 | 2023-12-23 12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调用一个有参数的函数时,函数名后边括号中的参数叫做实际参数,简称实参。而被调用的函数在进行定义时,括号里的参数叫做形式参数,简称形参。我们用个简单程序例子做说明。




unsigned char add(unsigned char x, unsigned char y);  //函数声明
void main(){
    unsigned char a = 1;
    unsigned char b = 2;
    unsigned char c = 0;
    //调用时,a 和 b 就是实参,把函数的返回值赋给 c
    //执行完后,c 的值就是 3
    c = add(a, b);
    while(1);
}
//函数定义,这里括号中的 x 和 y 就是形参
unsigned char add(unsigned char x, unsigned char y){
    unsigned char z = 0;
    z = x + y;
    return z;  //返回值 z 的类型就是函数 add 的类型
}



这个演示程序虽然很简单,但是函数调用的全部内容都囊括在内了。主调函数 main 和被调用函数 add 之间的数据通过形参和实参发生了传递关系,而函数运算完后把值传递给了变量 c,函数只要不是 void 类型,就都会有返回值,返回值类型就是函数的类型。
关于形参和实参,还有以下几点需要注意:
函数定义中指定的形参,在未发生函数调用时不占内存,只有函数调用时,函数 add中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放,这个前边讲过了,形参是局部变量。
实参可以是常量,也可以是简单或者复杂的表达式,但是要求他们必须有确定的值,在调用发生时将实参的值传递给形参。如上边这个程序也可以写成:c = add(1, a+b);
形参必须要指定数据类型,和定义变量一样,因为它本来就是局部变量。
实参和形参的数据类型应该相同或者赋值兼容。和变量赋值一样,当形参和实参出现不同类型时,则按照不同类型数值的赋值规则进行转换。
主调函数在调用函数之前,应对被调函数做原型声明。
实参向形参的数据传递是单向传递,不能由形参再回传给实参。也就是说,实参值传递给形参后,调用结束,形参单元被释放,而实参单元仍保留并且维持原值。

使用特权

评论回复
沙发
cashrwood| | 2024-1-3 12:17 | 只看该作者
如果函数需要处理的数据量较大,可以考虑使用指针作为形参类型,以减少内存占用和提高处理速度。

使用特权

评论回复
板凳
sesefadou| | 2024-1-3 15:16 | 只看该作者
形参和实参的数据类型应该相同或者赋值兼容。如果两者出现不同的数据类型,那么就会按照不同类型数值的赋值规则进行转换。

使用特权

评论回复
地板
louliana| | 2024-1-3 15:41 | 只看该作者
形参在函数内部只能访问,完成计算后,无法直接访问实参。

使用特权

评论回复
5
alvpeg| | 2024-1-3 16:29 | 只看该作者
实参的数量必须与形参的数量一致。

使用特权

评论回复
6
chenci2013| | 2024-1-3 19:05 | 只看该作者
C语言标准不支持函数调用时的默认参数。如果希望实现类似功能,可以在函数内部进行判断并设置合理的默认值。

使用特权

评论回复
7
pmp| | 2024-1-3 19:41 | 只看该作者
如果函数有参数,需要指定每个参数的类型,多个参数之间用逗号隔开。

使用特权

评论回复
8
beacherblack| | 2024-1-4 09:54 | 只看该作者
在调用函数时,需要按照函数定义的形参顺序和类型来传递实参。实参的值应当在调用函数之前确定。

使用特权

评论回复
9
jackcat| | 2024-1-4 10:31 | 只看该作者
对于指向动态分配内存的指针作为形参,需要确保在函数内外对内存的正确管理,防止内存泄漏。

使用特权

评论回复
10
beacherblack| | 2024-1-4 11:29 | 只看该作者
形参变量在函数被调用时分配内存,在函数调用结束时释放内存。

使用特权

评论回复
11
lihuami| | 2024-1-4 12:21 | 只看该作者
主调函数在调用被调函数之前,需要对被调函数做原型声明。

使用特权

评论回复
12
youtome| | 2024-1-4 13:18 | 只看该作者
形参只在函数执行期间占用栈空间,并且在函数返回后释放。因此,不要试图在函数外部访问形参变量,它们的作用域仅限于函数内部。

使用特权

评论回复
13
timfordlare| | 2024-1-4 16:04 | 只看该作者
函数的定义中形参的顺序决定了调用该函数时实参的顺序。如果实参的顺序与形参的顺序不一致,那么即使实参的数量和类型都与形参匹配,也会导致函数调用失败。

使用特权

评论回复
14
i1mcu| | 2024-1-4 16:34 | 只看该作者
形参的类型决定了它可以接受什么样的实参。如果实参的类型与形参的类型不兼容,那么在函数调用时,编译器会尝试进行类型转换。如果类型转换失败,就会导致编译错误。

使用特权

评论回复
15
hearstnorman323| | 2024-1-4 17:33 | 只看该作者
在函数调用时,需要为实参赋值。实参可以是常量、变量、表达式等。实参的值在函数调用时传递给形参,从而实现数据在主函数和函数之间的传递。

使用特权

评论回复
16
jtracy3| | 2024-1-5 09:23 | 只看该作者
在单片机编程中处理函数参数时,除了遵循基本的C语言规范外,还需要结合硬件资源限制和实时性要求进行合理设计。

使用特权

评论回复
17
qiufengsd| | 2024-1-5 09:42 | 只看该作者
形参定义时必须明确指定数据类型,调用函数时传入的实际参数必须与对应的形参类型一致或可隐式转换。例如,如果形参是整型,实参就不能是浮点型。

使用特权

评论回复
18
beacherblack| | 2024-1-5 17:14 | 只看该作者
在编写函数时,需要根据函数的功能和需求来定义形参的类型、个数和顺序。合理的形参设计可以提高函数的可读性和可复用性

使用特权

评论回复
19
alvpeg| | 2024-1-5 17:53 | 只看该作者
在一些MCU开发环境中,可以将形参声明为register类型,表示尽量将该变量存储在CPU寄存器中以提高速度。但要注意并非所有编译器都支持这一特性,而且可用寄存器的数量有限,过多地使用可能会造成其他问题。

使用特权

评论回复
20
mollylawrence| | 2024-1-5 19:01 | 只看该作者
在函数调用中,数据只能从实参传递到形参,不能反向传递。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

971

帖子

0

粉丝