c语言中形参与实参;局部变量与全局变量的区别

一直没能彻底的分清楚它们四个。
我知道形参与实参相互传递有效果的只能是传地址。
全局变量一般在外部定义,在整个程序中都有作用;局部变量只在定义范围内有用,退出后不影响。
但是在做题时还是不太分的开。特别是与结构题共用体一起用时更分不清了。
拿到这类题目时我们一般要怎么区分它考的用意呢。
例如:
#include"stdio.h"
struct ty
{ int date;
char c;};
main()
{struct ty a={30.'x'};
fun(a);
printf("%d%c",a.data,a.c);}
fun(struct ty b)
{b.data=20;
b.c='y';} 答案30x
我想知道怎样判断是实参还是形参。高手们请举些例子分析下(例子不要太显而易见了)。希望能帮我彻底搞懂它们四个。

c语言中形参与实参:
形参 form parameter
实参 real parameter
出现在函数定义中的参数,就叫形参
出现在函数调用中的参数,就叫实参
函数定义:
int max( int a , int b ) //这里的a,b就是形参
{
//在函数中,形参就可以当作是一个局部变量。
if ( a>b ) return a;
else return b;
}
函数调用
int main()
{
int a=3,b=5 ;

printf( "max=%d\n" , max(a,b) ); //这里的a,b就是实参 C中的函数参数传递是传递变量的数值,因此,这里相当于调用 max(3,5) 而子函数中收到的就会是 3 5这两值,而与ab变量没有关系。
return 0;
}

局部变量与全局变量的区别:
1)局部变量只在本函数范围有效,在此函数以外是不能使用这些变量;全局变量的有效范围是从定义变量的位置开始到本源文件结束。
2)局部变量是程序运行到该函数时给该变量分配内存空间,函数结束则释放该内存空间;全局变量是程序运行时事先分配内存空间,当程序结束时释放内存。
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-01-19
  实参是指函数调用时传入的参数,实参会被压入栈中,入栈过程由push命令实现。

  形参是指函数定义中声明的参数,形参从栈中获取实参的值,以此实现值传递。注意,从栈中获取值并不是通过pop命令实现的,因为栈顶是调用函数的那条语句的地址,所以不能使用pop,而是使用mov。
  函数入口处,会先上移栈顶指针esp,空出来的部分用来存储局部变量。因此说,局部变量的是存储在栈上的,初始值不确定,作用域为当前函数,因为离开当前函数后栈顶指针也要移动,所以这些变量的值可能被覆盖而变得没有意义。

  全局变量存储在全局区,未初始化的全局变量(值为0)存储在bss段,初始化的全局变量存储在data段。至于为何要引入bss段,而不是统统存在data段中,是因为bss段只要在程序中说明它的大小就可以了,而data段要记录整个段的值,所以如果有大量的未初始化的全局变量,存储在bss段中可以减少可执行文件的大小。

概括一下,局部变量的作用域为声明部分到语句块结束,即距离它最近的 { 和 } 之间。而全局变量的作用域为定义的位置到文件末尾及其他文件(需要提供声明)。再者两者在内存中存储的位置不同,以此导致两者的一些性质差异上面已经叙述。
第2个回答  2008-07-25
fun(struct ty b)
{b.data=20;
b.c='y';}

此处fun函数里的(struct ty b)是形参,
而在main函数里,调用fun函数时,a为实参传入fun函数,即结构体变量a的值30x
第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
就是这些了。
第4个回答  2008-07-26
一般在函数的定义:
类型标识符 函数名(形参)
此处就为形参;

在函数的调用:
函数名(实参)
此处就为实参

在你的程序中定义了
fun(struct ty b)
{b.data=20;
b.c='y';}
那么struct ty b为形参
主程序main中,调用了fun(a),则参数a就是实参本回答被网友采纳
相似回答