c语言函数实参与形参的联系_c语言形参和实参类型不一致

c语言函数实参与形参的联系_c语言形参和实参类型不一致函数参数在C语言的语法中:函数的参数包括两个部分:实参(实际参数)和形参(形式参数)实参(实际参数):真实传给函数的参数,叫实参

一、函数参数

 在C语言的语法中:

函数的参数包括两个部分:实参 ( 实际参数 ) 和形参 ( 形式参数 ) 

实参 ( 实际参数 ) :

真实传给函数的参数,叫实参。

讲得通俗易懂一点,就是在主函数中传递给函数的变量是实参。

| 例 |

#include<stdio.h> int Add(int x, int y) //变量x和变量y为形参 { return x + y; } int main() { int a = 10; int b = 20; int ret = Add(a, b); //变量a和变量b为实参 printf("a + b = %d\n", ret); return 0; }

实参的类型可以为: 常量,变量,表达式,函数等。

!! 值得注意的是 !!

无论实参是哪一种类型,在我们进行调用函数时,都要确保实参有确定的值,以便把这些值传递给形参。

形参 ( 形式参数 ) : 

形参是指在函数名后的括号中的变量,用于接收实参传递的值。

形参只有在函数被调用的过程中才会实例化 ( 分配内存单元 ) ,因此当函数调用完后,出了函数的作用域 ( 指的是 { } 的范围 ) 形参就会自动销毁。

也就是说,形参只有在函数中有效

 在上面的代码段的Add函数中的 x 和 y 就属于形参。

二、实参与形参之间的数据传递

实参传递数据给形参有两种方式,一种是传值 ( 传递数值 ) ,另外一种是传址 ( 传递地址 ) 

传值: 

若实参以传值的方式将数据传给形参,那么这时的形参充当的是实参的一份零时拷贝,在所调用的函数内部对形参的一系列操作,并不能影响主函数中的实参。

| 例 |

#include<stdio.h> void Swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10; int b = 20; printf("交换前>>a = %d b = %d\n", a, b); Swap(a, b); printf("交换后>>a = %d b = %d\n", a, b); return 0; }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATklDS25LMDgyNA==,size_15,color_FFFFFF,t_70,g_se,x_16

由代码运行图可以看出,交换前后变量a和变量b的值并没有发生改变。

而我们所期望的是,执行完Swap函数后交换变量a和变量b的值。很明显,用传值这一方法,将实参传给形参,并没有达到我们预期的结果。

为什么会这样呢?

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATklDS25LMDgyNA==,size_20,color_FFFFFF,t_70,g_se,x_16

在上图中可以看出实参 a 和 b 的的确确是把自身的数据以数值的方式传递过去给了形参 x 和 y。

x = a = 10,y = b = 20  执行完函数内部后 >> x = 20,y = 10

如果我们仔细观察会现:

&a = 0x0000004ddfbcf7a4       &b = 0x0000004ddfbcf7c4

&x = 0x0000004ddfbcf780       &y = 0x0000004ddfbcf788 

 实参 a 和形参 x 的地址不同,实参 b 和形参 y 的地址也不同。

也就是本篇博客前提到的,在实参和形参之间是以传值的形式传递数据时,形参只是实参的一份零时拷贝,对形参的修改不能改变实参。

那么解决的办法就是接下来要介绍的传址。

传址: 

 传址,顾名思义就是,将实参以地址的方式传递给形参。

| 例 | 

#include<stdio.h> void Swap(int* px, int* py) { int tmp = *px; *px = *py; *py = tmp; } int main() { int a = 10; int b = 20; printf("交换前>>a = %d b = %d\n", a, b); Swap(&a, &b); printf("交换后>>a = %d b = %d\n", a, b); return 0; }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATklDS25LMDgyNA==,size_14,color_FFFFFF,t_70,g_se,x_16

由代码运行图可以看出,实参以传递地址的形式将数据传给形参,形参用指针变量来接收实参的地址,在Swap函数内,对指针变量实现解引用操作,通过指针变量中存放的地址找到其指向的内容,从而达到修改主函数中实参数据的目的。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATklDS25LMDgyNA==,size_20,color_FFFFFF,t_70,g_se,x_16

如果我们仔细观察会现: 

&x = &a = 0x000000be5b6ffcf4

&y = &b = 0x000000be5b6ffd14

实参 a 和 b 分别将自己的地址传给形参 x 和 y,形参 x 和 y 通过地址找到他们分别的指向对象,也就是 a 和 b,借助临时变量 tmp 交换了 a 和 b 的数据。

三、传值 OR 传址

介绍了实参与形参的两种传递数据的方式,那么我们怎么判断什么时候传值,什么时候传址呢?

>> 如果调用函数的目的是改变主函数中实参变量时,则需要传值。

>> 如果不想改变主函数中实参变量时,则传值即可。

tips >> 形参变量的变量名可以和实参变量的变量名一样,并不会冲突。

新人写博客,如有错误望指出,十分感谢! 

今天的文章
c语言函数实参与形参的联系_c语言形参和实参类型不一致分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80918.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注