ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-03 14:59:04  阅读:126  来源: 互联网

标签:main 函数 int 局部变量 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() 在内的其它函数。

标签:main,函数,int,局部变量,C语言,作用域,专升本,全局变量
来源: https://blog.csdn.net/weixin_51563198/article/details/122775994

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有