C语言学习——函数(局部变量和全局变量)

目录

8.8局部变量和全局变量

局部变量

全局变量


8.8局部变量和全局变量

局部变量

在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。例如:

float f1(int a)
{
    int b,c;
    //a、b、c只在这个函数体内有效
}
​
int main()
{
    int m,n;
    //m、n只在这个函数体内有效
}

注意:

  • 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。

  • 形式参数也是局部变量。例如上面f1中的形参a,也只在f1函数中有效。其他函数可以调用f1函数,但是不能引用f1函数的形参a。

  • 在一个函数内部,可以再复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。

int main()
{
    int a,b;   // a、b在此范围内有效 (在整个主函数内有效)
    //....
    {
        int c;
        c = a + b;  //c在此范围内有效 (只在内部的中括号内有效)
        //....
        
    }
    //... ...
}

变量c只在复合语句(分程序)内有效,离开该复合语句该变量就无效,释放内存。

全局变量

程序的编译单位是源程序文件,一个源文件可以包含一个或若干函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为文本中其他函数所共用。它的有效范围从定义变量的位置开始到本源文件结束。例如:

int p = 1, q = 5;  //外部变量  p、q的作用范围从这里开始到下面全部
float f1(int a)  //定义函数f1
{
    int b, c;  
}
char c1, c2;   //外部变量  c1、c2的作用范围从这里开始到下面全部
char f2(int x, int y)  //定义函数f2
{
    int i, j;
}
int main()  //主函数
{
    int m, n;
}

在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量。

说明:

(1)设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数只能带回一个返回值,因此有时利用全局变量增加函数间的联系渠道,通过函数调用能得到一个以上的值。

为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯(但非规定),将全局变量名的第一个字母用大写表示。

有一个一维数组,内放10个学生成绩,写一个函数,求平均分、最高分和最低分。

#include<stdio.h>
​
float Max = 0, Min = 0;
​
int main()
{
    float average(float array[],int n);
    float ave,score[10];
    for(int i=0;i<10;i++)
    {
        scanf("%f",&score[i]);
    }
    ave = average(score,10);
    printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
    return 0;
 } 
 
 float average(float array[],int n)
 {
    float aver,sum=array[0];  //把实参数组的首元素的地址传递给形参数组 
    Max = Min = array[0];
    for(int i=1;i<n;i++)  //注意这里从1开始 
    {
        if(array[i]>Max) Max = array[i];
        if(array[i]<Min) Min = array[i];
        sum += array[i];
     }
     aver = sum/n;
     return (aver);
 }
​
//输入 
99 45 78 97 100 67.5 89 92 66 43
//输出 
max=100.00
min= 43.00
average= 77.65

Max和Min是全局变量,是公用的,它们的值可以供给各函数使用,如果在一个函数中,改变了它们的值,在其他函数中也可以使用这个已经改变的值。

由此可以看出,可以利用全局变量以减少函数实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗。

(2)建议不在必要时不要使用全局变量,原因如下:

  • 全局变量在程序的全部执行过程中都占用内存单元,而不是仅在需要时才开辟单元。

  • 它使函数的通用性降低了,因为函数在执行时要依赖其所在的外部变量。如果将一个函数移到另一文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他的文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强,与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。

  • 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。

(3)如果在同一个源文件中,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。

声明:本文章为个人学习笔记,资料整理参考谭浩强《C程序设计(第三版)》如有错误,欢迎大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值