形式参数和实际参数
函数的参数分为形参和实参两种。在本小节中,进一步介绍形参、实参的特点和两者的关系。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
函数的形参和实参具有以下特点:
1
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3
实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4
函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。
因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
例可以说明这个问题。
main()
{
int
n;
printf("input
number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
int
s(int
n)
{
int
i;
for(i=n-1;i>=1;i--)
n=n+i;
printf("n=%d\n",n);
}
本程序中定义了一个函数s,该函数的功能是求∑ni的值。在主函数中输入n值,并作为实参,在调用时传送给s
函数的形参量n(
注意,本例的形参变量和实参变量的标识符都为n,但这是两个不同的量,各自的作用域不同)。在主函数中用printf
语句输出一次n值,这个n值是实参n的值。在函数s中也用printf
语句输出了一次n值,这个n值是形参最后取得的n值0。从运行情况看,输入n值为100。即实参n的值为100。把此值传给函数s时,形参n的初值也为100,在执行函数过程中,形参n的值变为5050。返回主函数之后,输出实参n的值仍为100。可见实参的值不随形参的变化而变化。/---------------------------------------------------------------------------------/
函数的副作用是最令人头疼的问题
我们都知道形参使得函数可以改变调用者的变量值
所以很容易产生副作用
所以函数设计时应当避免频繁改变形参的值
这就是你所看到的现象:“不直接用型参参与运算”
这样就不会改变调用者的变量值
当然最后还是要改变形参的值,否则形参就没有意义了
还有另一个原因是编译有关的
局部变量是在栈分配空间的
生成的机器代码是近调用的短地址
而形参就很难说了
可能有的编译器,先按值参处理,最后再用结果修改形参
这样做就不用担心“直接用型参参与运算”的会频繁修改形参了
但是却不符合形参的本义
因此编译器会直接引用形参的地址,就会生成远调用的长地址了
把形参编译成长短不同的地址,这在调用系统功能时就有讲究了
你的代码里有“interrupt”字样,我没猜错的话就是中断调用
这时需要长地址还是短地址,那可是一点也不可弄错了
用局部变量就会得到短地址
在int strassign(Str &str,char ch)中,str是引用传递,ch是以'\0'结束的字符串,无论ch是字符数组,还是字面常量,都会将形参的首地址作为指针传递给被调函数,在所给实例中,形参是字面常量,编译器会在“栈”中分配空间用以存放字面常量,这与在主调函数中用字符数组或指针调用完全一样。
#include <stdioh>
struct xiyou_stu
{
char name[20];
int num[10];
};
void fun(struct xiyou_stu x[])
{
}
int main(void)
{
struct xiyou_stu xiyou[100];
fun(xiyou);
}
或者可以这么写
typedef struct xiyou_stu
{
char name[20];
int num[10];
}xiyou_type;
void fun(xiyou_type x[])
{
}
int main(void)
{
xiyou_type xiyou[100];
fun(xiyou);
}
对照函数定义 int fscanf(FILEstream,constcharformat,[argument]);
所以你前面两处是正确的,后面的是错的
fscanf( stream, "%f " , p[i] ) ;-->fscanf( stream, "%f " ,&p[i] ) ;
fscanf( stream, "%f " , w[i] ) ;-->fscanf( stream, "%f " , &w[i] ) ;
我认为
static型变量能够保持上一次的值不变
那么下一次调用函数时,再对其赋值是无效的
因为它的值上一次的保持不变
比如:
for (i=0; i<3; i++ )
{
static j = 0; //每次循环对 j 赋值为0,可是赋值无效,输出结果还是:1 2 3
j++;
printf("%d ", j);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)