C语言学习笔记

  之   函数调用与变量的作用域

但凡程序就离不开函数,不管是高级语言还是C语言,函数是组成程序的单位。形形×××的函数既扮演着自己的角色,又在总体中担任着举足轻重的角色。

一:函数调用

函数的基本形式:

无参数函数一般形式

有参数函数一般形式

函数类型说明符 函数名()

{    

     函数体;

函数类型说明符 函数名()

    函数体;

 以一个程序实例来阐述函数的一些注意事项。


#include <stdio.h>
float ave(float b[],int m); //函数声明
main()
{
  float a[20],aver;   
  int j,n;
  printf("输入班级的人数\n");
  scanf("%d",&n);
  printf("输入分数:\n");
  for(j=0;j<n;j++)
  {
     scanf("%f",&a[j]);
  }
  /*
     调用ave函数,a和n是实参,a是数组名,代表数组首地址,n是值。
  */
  aver=ave(a,n);  
  printf("平均分是 %f\n",aver);
}
float ave(float b[],int m)//函数ave b[]和m是形参,数组b的接受的是a[]的首地址,m接受n的值
{
   int i;
   float aver1,sum=0;
   for(i=0;i<m;i++)
   {
      sum+=b[i];
   }
   aver1=sum/m;
   return(aver1);//返回平均值给main函数,用来输出
}


132245799.png

1.每个函数必须单独定义,不允许嵌套定义,即不能在一个函数的内部再定义另一个函数

2. 形参:在进行函数定义时设定的参数

  实参:在进行有参函数调用时所用的参数

3 .实参传递给形参的方式:

    值传递(值单向传递方式)

        如上程序中的实参a传递给形参b[],a是数组名,代表的是数组的首地址。实参数组名a并不是将数据a中所有学生的成绩传送给了形参数组b,而是将实参数组的首地址传递给了b,从而使这两个数组共用同一个存储空间,即a[0]=b[0]......

    地址传递方式

        如上程序中的实参n传递给了形参m nm都是实实在在的值。

    需要注意的是:在被调函数中,形参的类型必须与实参要一致,比如:参数的a[]float,那么形参中的数组b[]也必须是float类型

4. 函数返回值

在被调函数内采用return语句获得函数的返回值,一个函数利用return语句只能返回一个值。

return语句中的表达式的类型应该与函数类型说明是一致的。比如:程序中的,aver函数中的return(aver1)中的aver1的类型与函数aver的函数类型一样,即都是float.

但是当return语句中的表达式的返回值类型与函数的类型不一致时候,应与函数类型说明符为准。系统会自动将return返回值转换为函数类型说明符的类型。

当函数的返回值的数据类型是int时,在函数定义时,函数类型说明符可以省略,也就是说,系统默认的返回值类型是整型。

5. 函数的声明

程序中一切都遵循先定义后使用的原则,函数也不例外。

上述程序中,aver函数定义在main函数之后,所以不遵循先定义后使用的原则,为了防止这种事情的发生,我们先用一个函数声明来避免这一点,那就是在main函数之前加上的函数声明语句:float ave(float b[],int m);

如果将函数aver放到main函数之前的话,就不用加这一条声明语句了。

二:变量的作用域

int m,n;

double fun(int x ,int y)

{

  int m,n;

  ....

}

main()

{

  int a,b;

    if ()

    {

         int x,y;

     }

}

1.局部变量

局部变量只能在局部使用。上述中的函数fun中的x,ym,n只能在函数fun中有效,一旦出了fun的范畴就没有用了。再比如if中的xy只能在if()中使用。

2.全局变量

第一行的mn,就是全局变量,这两个变量在全部函数中都能使用

但是我们看到mn和函数fun中的mn重名了,那执行函数fun中的mn的时候,到底用全局变量还是用局部变量,答案是局部变量。