c语言函数中形参值的变化 c语言函数形参可以是什么

C语言函数调用中形参值的变化不会传递给实参形参和实参拥有分别c语言函数中形参值的变化的存储空间c语言函数中形参值的变化,即便是指针传递c语言函数中形参值的变化,改变的也只可能是这个指针变量所指向的内容c语言函数中形参值的变化,而不是指针变量本身的值,也即,如有指针变量p,那对实参的变化,有可能改变的也只是*p的值,而不是p本身的值 。
在c语言中怎样使形参值改变实参值也跟着改变在C里面是无法做到形参改变 实参值同步改变的 。
只能通过传地址的方式
即参数类型为指针
这样 形参指向空间修改 , 可以使得实参指向空间同步修改,因为是同一块内存区域 。
另外,在C中 , 可以通过引用传参,来实现你说的目的 。
C语言函数中的形参和实参分别是指什么?形参出现在函数定义中 , 在整个函数体内都可以使用,离开该函数则不能使用 。实参出现在主调函数中,进入被调函数后,实参变量也不能使用 。形参和实参的功能是作数据传送 。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送 。
1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元 。因此,形参只有在函数内部有效 。函数调用结束返回主调函数后则不能再使用该形参变量 。
2.实参可以是常量、变量、表达式、函数等 , 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参 。因此应预先用赋值,输入等办法使实参获得确定值 。
3.实参和形参在数量上 , 类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误 。
4.函数调用中发生的数据传送是单向的 。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参 。因此在函数调用过程中,形参的值发生改变 , 而实参中的值不会变化 。
c语言中函数可否改变参数值#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
x);
printf("y
=
%d
at
[%x]n",
y,
y);
printf("z
=
%d
at
[%x]n",
z,
z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
运行结果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序栈底为高地址,栈顶为低地址 , 因此上面的实例可以说明函数参数入栈顺序的确是从右至左的 。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的 。比如,pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定 , 如visual
c.即然两种方式都可以,为什么c语言要选择从右至左呢?
进一步发现 , pascal语言不支持可变长参数,而c语言支持这种特色,正是这个原因使得c语言函数参数入栈顺序为从右至左 。具体原因为:c方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数 。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底 。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数 。这样就变成了左边参数的个数不确定 , 正好和动态参数个数的方向相反 。
因此,c语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式 。换句话说,如果不支持这个特色,c语言完全和pascal一样 , 采用自左向右的参数入栈方式
【c语言函数中形参值的变化 c语言函数形参可以是什么】c语言函数中形参值的变化的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言函数形参可以是什么、c语言函数中形参值的变化的信息别忘了在本站进行查找喔 。

    推荐阅读