第1个回答 2016-01-19
实参是指函数调用时传入的参数,实参会被压入栈中,入栈过程由push命令实现。
形参是指函数定义中声明的参数,形参从栈中获取实参的值,以此实现值传递。注意,从栈中获取值并不是通过pop命令实现的,因为栈顶是调用函数的那条语句的地址,所以不能使用pop,而是使用mov。
函数入口处,会先上移栈顶指针esp,空出来的部分用来存储局部变量。因此说,局部变量的是存储在栈上的,初始值不确定,作用域为当前函数,因为离开当前函数后栈顶指针也要移动,所以这些变量的值可能被覆盖而变得没有意义。
全局变量存储在全局区,未初始化的全局变量(值为0)存储在bss段,初始化的全局变量存储在data段。至于为何要引入bss段,而不是统统存在data段中,是因为bss段只要在程序中说明它的大小就可以了,而data段要记录整个段的值,所以如果有大量的未初始化的全局变量,存储在bss段中可以减少可执行文件的大小。
概括一下,局部变量的作用域为声明部分到语句块结束,即距离它最近的 { 和 } 之间。而全局变量的作用域为定义的位置到文件末尾及其他文件(需要提供声明)。再者两者在内存中存储的位置不同,以此导致两者的一些性质差异上面已经叙述。
第3个回答 2008-07-26
形参与实参:c程序一般都是一个主函数main和一些自定义的函数组成,自定义函数只是描述的一类别算法,其中的参数随着需求而变,称为形式参数;你在主函数中调用自定义函数时,自定义函数名后面的参数写的就应该是实际参数;而你自定义的函数时,自定义函数的后面就是形参了。
例如:
#include<stdio.h>
void main()
{
int max(int c,int d);
int a=2,b=5;
printf("%d",max(a,b));
}
int max(int c,int d)
{
return c>d?c:d;
}
其中,主函数main中printf("%d",max(a,b)); max后的a和b都是实际参数;自定义时int max(int c,int d)中c和d都是形式参数,他俩的值随着函数调用时的实参变化而变化。就内存来讲,形参只是在自定义函数被调用时才给形参分配内存,调用结束后就释放,也就是说你要是想输出c,d 是不可能的。一句话:实参就是主函数中的参数,形参就是自定义函数中的参数,既是虚的参数。
局部变量和全局变量:
全局变量是定义在函数外面的变量,即在所有 { } 外面,他的作用范围是整个程序,也就是说你在任何函数内可以直接使用,不必每次都定义;但是如果在一个函数内,局部变量与全局变量名相同,使用这个变量时,以定义的局部变量的值为准,但不改变全局变量的值!
局部变量是定义在一个函数里的变量,即在某一个 { } 里面,他只能在这个函数范围内使用。
例如:
下面程序的输出结果是____。
int w=3; /* 变量w就是全局变量*/
main()
{ int w=10; /*局部与全局变量名相同,在本函数中以局部值为准,但不改变全局变量值*/
printf("%d\n",fun(5)*w); /*这里的w值是10 /
}
fun(int k)
{ if(k==0) return(w); /*这里的w还是全局的值*/
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
参考答案: B
首先程序是要求我们输出fun(5)*w,这里的w的值应该是主函数里定义的10而不是外面的全局变量3(变量的作用域),然后程序去调用子函数fun()来计算fun(5),根据题目,即返回fun(4)*5,... ,递归调用,相当于fun(0)*1*2*3*4*5,而到fun(0)里应返回w,这里的w就是全局变量3了,因为这fun()中没有再次定义w这个变量。所以fun(5)最后的结果应该是3*1*2*3*4*5=360。
因此最终结果为fun(5)*10=3600
就是这些了。