函数(二)

函数的参数传递

函数的参数

函数的参数分为两类:形式参数和实际参数。形式参数是指在定义函数时,函数后面括号中的函数名称。实际参数指在函数调用时,函数名后括号中的变量名称。
函数形参表由用逗号隔开的参数类型和参数数组名组成,如果两个参数具有相同的类型,参数必须分开声明。如:
int abs(int a,int b);
参数表中不能出现同名的数据,相同的,函数的局部变量也不能使用与函数参数相同的变量名。
在调用中如果函数有参数,则必须采用实参表将每一个实参的值相应的传递给每一个形参变量,而形参变量在接收到实参表传过来的值时,会在内存中开辟新的临时空间,以保存形参变量的值(实参复制而来),函数执行完毕时,这些临时开辟的内存空间会被释放,并且不论形参的值在函数中是否发生变化,都不影响实参变量的变化。这种调用方法称为‘传值’。例:

#include 
void swap(int a,int b);
int main()
{
  int a=100,b=300;
  swap(a,b);
  printf("%d,%d",a,b);
  return 0;
}
void swap(int a,int b){
  int temp=x;
  x=y;
  y=temp;
  printf("%d,%d",x,y);
}

函数调用swap时,会给形参变量想x,y
开辟临时内存空间,接着将100,200复制一份,分别保存在这两个存储单元中;函数调用一结束,这个内存空间就会被释放掉,调用函数期间对x,y做的任何操作都不会影响到实参a,b。这种传值方式调用函数时,实参也可以是函数调用语句。例:
int x,y,z,s;
s=sum(sum(x,y),z);


int sum(int a,int b)
{


}

数组作为函数参数传递

可采用两种方法:(1)数组元素作为函数参数
如果将数组元素作为函数的实参,那么函数的形参必须是简单变量。调用过程属于传值的调用方式,是残的值单向传递给形参。例:

#include 
void fun(int a,int b,int c);
int main()
{
  int s[3]={200,300,500};
  printf("函数调用前数组元素的值:\n");
  printf("s[0]=%d\ns[1]=%d\ns[2]=%d\n",s[0],s[1],s[2]);
  fun(s[0],s[1],s[2]);
  printf("函数调用后数组元素的值:\n");
  printf("s[0]=%d,s[1]=%d,s[2]=%d",s[0],s[1],s[2]);
  return 0;
}
void fun(int a,int b,int c)
{
  a=a/10;
  b=b/10;
  c=c/10;
  printf("函数调用中形参的值:\n");
  printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}

(2)数组名作为函数参数
这种调用方法叫做“传址”。数组名代表数组在内存中的首地址,调用函数时实参把数组在内存中的首地址传递给形参。例:

#include 
void fun(int a,int b);
int main()
{
  int s[3]={500,300,200};
  printf("函数调用前数组元素的值:\n");
  printf("s[0]=%d\ns[1]=%d\ns[2]=%d\n",s[0],s[1],s[2]);
  fun(s);
  printf("函数调用后数组元素的值:\n");
  printf("s[0]=%d\ns[1]=%d\ns[2]=%d\n",s[0],s[1],s[2]);
  return 0;
}
void fun(int a[ ])
{
  a[0]=a[0]/10;
  a[1]=a[1]/10;
  a[2]=a[2]/10;
  printf("函数调用中修改数组元素的值:\n");
  printf("a[0]=%d\na[1]=%d\na[2]=%d\n",a[0],a[1],a[2]);
}

运行后实参的值发生了改变。因为实参素组与形参数组共同使用一个内存单元,当形参的值发生变化时,是残的值也跟着变化。

变量的作用域与存储内型

变量的作用域

变量的作用域指的是程序中能引用该变量的范围。根据变量不同的作用域可以分为局部变量和全局变量
1.局部变量:在函数内部或某个控制块内部定义的变量成为局部变量。有限范围只限于定义本·函数内部,本函数外无效。
2.全局变量:在函数外部定义的变量叫做全局变量。有效范围从该变量定义的位置开始,直到源文件结束。
在一个函数中既可以使用局部变量也可以使用全局变量

变量的存储类型

指的是变量的存储属性,说明变量占用存储空间的区域。在内存中,供用户使用的存储区域由程序区、静态存储区、动态存储区三部分组成。变量的存储类型有auto型、register型、static型和extern型。
auto型变量存储在动态存储区中;register型变量保存在寄存器中;static型变量存储在静态存储区中。
局部变量的存储类型默认为auto型,全局变量的存储类型默认为extern型。
auto型和register型只用于定义局部变量。
static型即可以定义局部变量又可以定义全局变量。定义局部变量时,局部变量的值将被保留,若定义时没有赋初值,系统自动为其赋值为0;定义全局变量时,其有效范围为他所在的源文件,其他源文件不能使用

你可能感兴趣的:(C语言,c语言)