题主是否想询问“函数的实参传递到形参有哪两种方式?”值传递和地址传递。
1、值传递是指将实参的值复制一份,传递给形参,这样函数内部对形参的修改不会影响到实参,这种方式适用于传递基本数据类型和结构体等简单的数据类型,它的优点是传递简单、 *** 作方便,缺点是当参数很大时会造成内存和时间资源的浪费。
2、地址传递是指将实参的地址传递给形参,这样函数内部对形参的修改会影响到实参,这种方式适用于传递数组、结构体等较为复杂的数据类型,它的优点是节约内存、传递的是数据的地址,速度快,缺点是 *** 作稍微复杂一些。
这两道题都是用的传值方式,区别是
38题返回struct类型,其值改变是在函数返回之后,在执行函数过程中
a的值都是不变的。
你可以把38题中a=f(a);改为f(a);就和37结果一样了
若用数组名作为函数调用时的实参,则实际上传递给形参的是数组首地址。
数组首地址数组第一个元素的地址。数组名字本身就是一个指针,它是一个指针常量,指向的地址不变。
比如定义了一个数组变量,编译器就会在内存中划分了一块地址空间给它,数组名这个指针常量就指向了这块内存空间的首地址,而数组首元素就存在这段内存空间的首地址处,即这段内存空间的首地址跟数组首元素的内存地址是一样的。
扩展资料:
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
没有形参的函数在形参表的位置应该写voidmain 函数也可以有形参和返回值,其形参也称为命令行参数,由 *** 作系统在启动程序时初始化,其返回值传递给 *** 作系统。
两者关系:
在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
一、函数中使用:
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
二、调用
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
三、不是指针类型在内存中位置不同:
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
举例:
1 比如你定义一个函数void add(int a, int b),这里的a和b就是形参。
2 当你进行函数调用的时候,add(1, 2),这里的1和2就是实参。
扩展资料
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
没有形参的函数在形参表的位置应该写voidmain 函数也可以有形参和返回值,其形参也称为命令行参数,由 *** 作系统在启动程序时初始化,其返回值传递给 *** 作系统。
两者关系:
在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
参考资料:
-形参
-实参
在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两
个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量,所进行的值是单向的,即只能从实参传向形参,不能从形参传回实参
第二结构体中有数组元素,即数组名作为函数参数时所进的传递只是地址的传递,,实际上形参数组和实参数组都为同一数组,共同拥有一段内存空间,因此,形参改变,实参也跟着改变。
这里实参自然不会变化,你这么理解,实参是实际参与到函数计算中的参数,但你这里函数的返回值中,并不包含输入实参的变化,固实参是无变化的。简单说,该函数fun是将两输入参数进行互换的 *** 作,但是整个互换 *** 作是在单独的内存空间中完成的,最终函数并没有对输入参数的地址对应的数据进行更改,所以你可以认为是虚的跑了一遍计算,最终什么都没改变。
函数实参与形参之间的数据传递方式是( 值传递)传递方式,在C语言中,数据传递方式有值传递和引用传递,值传递:传值,实际是把实参的值赋值给行参,相当于copy。
那么对行参的修改,不会影响实参的值 。引用传递: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。
扩展资料传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。
引用传递是将变量的内存地址传递给方法,方法 *** 作变量时会找到保存在该地址的变量,对其进行 *** 作。会对原变量造成影响。可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
参考资料:
c语言中数组名作为实参传给被调用的函数时,形参获得的是数组的起始地址。
还是用例子说话吧。
#include
int
arry(int
a)
{
int
b;
b
=
a;
int
i;
for(i=0;i<5;i++)
{
printf("%d",a[i]);
}
return
b;
}
int
main()
{
int
a[5]
=
{1,2,3,4,5};
int
c;
int
i;
c
=
arry(a);
for(i=0;i<5;i++)
{
printf("%d",c[i]);
}
}
主要是通过指针把数组,例如main里面的a的地址传入arry函数,然后在arry函数中用一个兼容类型的指针接收地址,然后就可以再这个指针下的地址 *** 作地址上面的数据了。
arry返回的时候也是返回一个指针(地址)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)