C语言 局部变量和全局变量

一、局部变量
在一个 函数 内部 定义的变量叫做 局部变量,它只在 本函数范围内有效。也就是说,只有在本函数内才能使用它们,在本函 数外是不能使用这些变量的。
#include<stdio.h>
//函数声明
void func1(int tmpvalue);
int main()
{
    int m,n;  //局部变量,但是只在main()函数内有效
    int k=4;   //局部变量,但是只在main()函数内有效
    return 0;
    //1、主函数main()中定义的变量m,n,k只在主函数中有效,虽然主函数调用了其他函数,但是在其他函数中依旧无法使用主函数中定义的变量
    //2、不同的函数可以使用相同的变量名,互不干扰。
    //3、形式参数,也是局部变量,比如func1中的tmpvalue,只在func1函数中有效。
    //4、有一种特殊写法,用一个大括号写一段代码,大括号括起来的这个叫复合语句,在该复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也叫程序块
    int a,b; //这里的有效范围直到函数末尾
    //....
    {
      int c; //c有效范围只在这个复合语句内,一旦离开复合语句,变量的内存就被系统释放掉了。
      c=a+b;
    }
}
//函数定义
void func1(int tmpvalue)
{
    //这里无法使用main()函数中定义的m,n,k
    int x,y;  //局部变量,但是只在func1()函数内有效
    int m,n;  //这里的和main()中的m,n完全不同,占用的内存地址也完全不同。
}
一个项目可以由一个或者多个源程序文件(project1.cpp)组成。
二、全局变量
函数 定义的变量称为 全局变量(外部变量)。 可以为本文件中其他函数共用
全局变量的有效范围: 从定义变量的位置开始本源程序文件结束
如果你在整个文件开头定义了该变量,则整个文件范围内都可以使用该全局变量。
总结:在一个函数中,既可以使用本函数中的局部变量,又可以使用有效的全局变量。
#include<stdio.h>
//函数声明
void func1(int tmpvalue);
int p=1,q=5;  //全局变量,因为在函数外部定义的
//函数定义
void func1(int tmpvalue)
{
    //这里无法使用main()函数中定义的m,n,k
    int x,y;  //局部变量,但是只在func1()函数内有效
    int m,n;  //这里的和main()中的m,n完全不同,占用的内存地址也完全不同。
}
char c1,c2;  //全局变量,从定义的位置,到文件末尾结束
char f2(int x,int y)
{
    int i,j;


    return 0;
}
int main()
{
    int b,c;


    return 1;
}
全局变量的优缺点:
优点:增加了函数与函数之间的数据联系渠道,如果一个函数中改变了全局变量的值,就能影响到其他函数,相当于在各个函数之间有了直接的传递通道,不再需要通过实参和形参来传递参数值了。
缺点:
a.只有在必要的时候才使用全局变量(要谨慎使用),因为全局变量在程序运行整个周期之间都占用内存,而不像函数内的局部变量(当函数执行完毕后,局部变量所占的内存会被系统回收)。
b.降低了函数的通用性,因为函数执行时要以来这些外部的全局变量了,如果将函数迁移到另外一个文件中,那这些相关的外部变量就一起跟着移植过去,并且如果你迁移到另外一个文件中也有同名全局变量,那就更加麻烦。
c.东一个全局变量,西一个全局变量,降低了程序的清晰性和可读性,读程序的人难以清楚的判断每个瞬间各个外部变量的值。(因为很多函数都可以改变全局变量的值),所以,要限制使用全局变量。
#include<stdio.h>
//函数声明
void func1(int tmpvalue);
int c1=4,c2=5;  //全局变量,因为在函数外部定义的
//函数定义
void lookvalue()
{
  c1=6;  //给全局变量赋值
  c2=9;
  return;
}
int main()
{
    
    lookvalue();
    printf("c1=%d\n",c1);
    printf("c2=%d\n",c2);
    return 0;
}

总结:
(1)、如果某个函数想 引用在他后面定义的全局变量,则可以用一个关键字叫 extern 做一个“ 外部变量说明”,表示该变量在函数的外部定义,这样函数内就能使用,否则编译就会出错。
所以,结论是全局变量(外部变量)的定义就放在引用他的所有函数之前,就可以避免使用这个extern。
(2)、要严格区分 外部变量与一个 外部变量说明
外部变量的定义 只能有一次,位置是所有函数之外,定义时 会分配内存,定义时 可以初始化值
而同一个文件中,外部变量说明是 可以有很多次的(外部变量说明 不分配内存),外部变量声明 放在最上面,所有函数之外。也可以在每个函数之内做外部变量说明(但是这个声明了的变量仅仅在函数内有效),因此进一步加深了对外部变量说明的理解:所声明的变量是已在外部定义过的变量,extern这个声明,仅仅是为了引用该变量而做的“声明”。
#include<stdio.h>
//函数声明
void func1(int tmpvalue);
extern int c1,c2;  //外部变量说明,表示某个地方定义了c1,c2这两个全局变量。【不是定义,不分配内存的】
//函数定义
void lookvalue()
{
  c1=6;  //如果这里要使用全局变量的话,就要进行全局变量说明
  c2=9;
  return;
}
int c1=4,c2=5;  //定义全局变量,因为在函数外部定义的【是定义,系统会分配内存的】
int main()
{
    
    lookvalue();
    printf("c1=%d\n",c1);
    printf("c2=%d\n",c2);
    return 0;
}
(3)、在同一个源文件中,如果全局变量和局部变量 同名,则 在局部变量作用范围内全局变量 不起作用(当然值也不会受到 影响)。
例题一:
#include<stdio.h>
//函数声明
void func1();
int c1=4,c2=5;  //全局变量,因为在函数外部定义的
//函数定义
int main()
{
    func1();
    printf("函数外的c1=%d\n",c1);  //打印出来的全局变量
    printf("函数外的c2=%d\n",c2);
    return 0;
}
void func1()
{
    int c1,c2;
    c1=100;  //这里是给局部变量赋值,而不是全局变量赋值
    c2=200;
    printf("函数内的c1=%d\n",c1);  //打印出来的局部变量
    printf("函数内的c2=%d\n",c2);
}
例题二:
#include<stdio.h>


int a=10,b=20;  //全局变量,因为在函数外部定义的
//函数定义
void lookvalue(int a,int b)
{
    //在局部变量作用范围内,全局变量不起作用
    a=100;
    b=200;
    return;
}
int main()
{
    a=4;
    b=5;
    printf("函数外的c1=%d\n",a);  //4
    printf("函数外的c2=%d\n",b);  //5
    lookvalue(a,b);
    printf("函数外的c1=%d\n",a);  //4
    printf("函数外的c2=%d\n",b);  //5
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值