计算机科学类专升本复习之“C语言全局变量和局部变量”详解(初稿)

C语言全局变量和局部变量(带实例讲解)

形参变量需要等到函数被"调用"时才能分配内存,调用结束后立即释放内存。

这说明 "形参变量"的作用域 非常有限,只能在"函数内部"使用,离开函数就无效了,这就是变量的"有效范围"。

一、所谓的"局部变量"

    就是定义在 "函数内部的变量",它的作用域仅限于"函数内部",离开函数后就是"无效的",再使用就会报错!

例如:

int kangkang(int a)

{

    int b,c; //abc仅在函数kangkang()内有效,出了kangkang()函数再调用就会报错

    return a+b+c;

}

int main()

{

    int m,n;//m,n仅在函数main()内有效

    return 0;

}


 

这边几点需要注意一下:

1. 在main()函数中 定义的变量也是"局部变量(别以为它是main函数你就搞特殊,会被抓的)",只能在main函数中使用,

同时main函数中也"不能使用其他函数中定义的变量"。因为main函数也只是一个函数,与其他函数地位平等。

2. "形参变量"在函数体内定义的变量"都是"局部变量。"实参"给"形参"传值的过程也就是 局部变量赋值的过程。

3. 可以在不同的函数中使用相同的"变量名",因为它们表示不同得数据,分配不同的内存,互不干扰,也不会发生混淆。

4.在"语句"中也可以定义变量,它的"作用域"只限于"当前语句块"。

二、全局变量

什么叫做 函数的全局变量 ?

    在所有"函数外部"定义的变量成为"全局变量"。

全局变量的作用域是什么?

    全局变量的作用域默认是"整个程序",也就是所有的"源文件、包括.c和.h文件"。

//例如:

int a,b;//定义a,b两个全局变量

void kangkang1()

{

    //todo

}

float x,y;//定义x,y两个全局变量(在所有函数的外部)

int kangkang2()

{

    //todo

}

int main()

{

    //todo

    return 0;

}

a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 kangkang1() 之后,所以在 kangkang1() 内无效;

而 a、b 定义在源程序的开头,所以在 kangkang1()、kangkang2() 和 main() 内都有效。


 

三、局部变量和全局变量的综合示例

eg1: 输出变量的值

#include<stdio.h>

int n = 10; //全局变量

void kangkang1()

{

    int n = 20; //局部变量

    printf("kangkang1 n: %d\n",n);

}



void kangkang2(int n)

{

    printf("kangkang2 n: %d\n",n);

}



void kangkang3()

{

    printf("kangkang3 n: %d\n",n);

}



int main()

{

    int n = 30;  //局部变量

    kangkang1();

    kangkang2(n);

    kangkang3();

    //代码块由{}包围

    {

        int n = 40; //局部变量

        printf("block n:%d\n",n);

    }

    printf("mian n : %d\n",n);

    return 0;

}

结果:

kangkang1 n: 20

kangkang2 n: 30

kangkang3 n: 10

block n:40

mian n : 30

解释说明:

代码中虽然定义了多个同名变量 n,但它们的作用域不同,在内存中的位置(地址)也不同,所以是相互独立的变量,互不影响,不会产生重复定义(Redefinition)错误。

1. 对于 kangkang1(),输出结果为 20,显然使用的是函数内部的 n,而不是外部的 n;

kangkang2()结果显示为30也是相同的情况,因为程序都是从mian函数开始运行,mian中定义了一个局部变量n=30,而kangkang2(n);正好调用了当中的n,所以输出为30;

当"全局变量"和"局部变量"同名时,在"局部范围内全局变量被“屏蔽”",不再起作用。或者说,变量的使用遵循"就近原则",如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。

2. kangkang3() 输出 10,使用的是全局变量,因为在 kangkang3() 函数中不存在局部变量 n,所以编译器只能到函数外部,也就是全局作用域中去寻找变量 n。

3.  由{ }包围的代码块也拥有"独立的作用域",printf() 使用它自己内部的变量 n,输出 40。

4.  C语言规定,只能"从小的作用域向大的作用域中去寻找变量",而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。


 

eg2:根据长方体的 长宽高 求它的体积 以及 三个面的面积

#include<stdio.h>

int s1,s2,s3;   //定义三个面积

int vs(int a,int b,int c)

{

    int v;  //定义体积v

    v = a*b*c;

    s1 = a*b;

    s2 = b*c;

    s3 = a*c;

    return v;

}



int main()

{

    int v,length,width,height;

    printf("请分别输入长方体的长和宽及高:\n");

    scanf("%d %d %d",&length,&width,&height);

    v = vs(length,width,height); //将三个实参传递到 vs函数中的形参中

    printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);

    return 0;

}

结果:

请分别输入长方体的长和宽及高:

5 6 8

v=240,s1=30,s2=48,s3=40

根据题意,我们希望借助一个函数得到三个值:体积 v 以及三个面的面积 s1、s2、s3。

遗憾的是,C语言中的函数只能有一个返回值,我们只能将其中的一份数据,也就是体积 v 放到返回值中,而将面积 s1、s2、s3 设置为全局变量。

全局变量的作用域是整个程序,在函数 vs() 中修改 s1、s2、s3 的值,能够影响到包括 main() 在内的其它函数。

上一篇:Vue3工程用Vue2示例


下一篇:第二章 用C语言编写程序