形参与实参
形参与实参的区别,还有以地址为参时
[解决办法]
在定义函数中指定的形参,在未出现函数调用时,他们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
实参可以是常量、变量和表达式,但要求有确定的值。在调用时将实参的值赋给形参。
在C语言中,实参向形参的数据传递是值传递,单向传递,只由实参传给形参,而不能由形参传给实参。在内存中,实参单元和形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留原值。
指针变量作函数参数也要遵循这一规则。不可能通过调用函数来改变实参变量的值,但可以改变实参指针变量所指变量的值。
函数的形参和实参具有以下特点:
1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。例5.3可以说明这个问题。
[解决办法]
形参,即形式参数,顾名思义是形式上的、假的、不含确定值的、做声明作用的参数。
如int myfunc(int num,char *str)中num和str都是形式参数。
实参,即实际参数,顾名思义是调用方传递给函数的参数,是实际的、含确定值的参数,其类型必须与函数中定义的形参类型匹配。
如调用myfunc(1,"abcdefg")中1和"abcdefg"就是实参,具有确定的值的参数。
以地址为参和以值为参是两种不同的传值方式,两者的主要区别是前者对参数的修改会反映到原始值,而后者的修改只是在它的一个拷贝上进行的,不会影响到原始值。
[解决办法]
实参与形参的最大区别只需记住,在函数调用中是单向传递的,即在函数中传递的只是实参的值,形参的改变不影响实参,如果传递的是实参的地址,那就不一样了,此时形参就相当于实参,形参改变,实参就改变,楼主可以自己找例子试试就知道了
[解决办法]
形参和实参是一个问题,和以地址为参数不一样。
形参和实参其实很好理解,形参就是你定义的形式参数,实参就是你调用传进去的实际参数。
形参是形式的,是定义时候的。
实参是实际的,是调用时候的。
以地址为参数是指针做参数。
这个要注意形参和实参
void fenpei(void* p)
{
p = malloc...;
}
// 这样调用是不行的
void* p = 0;
fenpei(p);
这个时候p还是0.
[解决办法]
形参和实参在内存中时不同的存储空间 而数据只能由实参传向形参 单向传递 所以形参的改变不会改变实参 如果是地址则是直接操作的内存空间 这时就是同一个内存空间了 所以会改变值
[解决办法]
函数的形参,也叫函数接口,是用于接收传进来的参数。形参是在其定义的函数栈上申请空间和存放的。因此其作用范围是函数内部。实参是在调用函数内定义的或者是全局变量等,实参到形参的传递是一一对应的关系。