全局变量和局部变量

经常在C语言中遇到这样的情况,一个.c文件中定义的 全局变量例如i,在另一个.c文件中能用使用吗?
答案是:可以的,全局变量默认是extern的,函数也是。如果你写了static修饰它就不行了

下面是各个概念:

全局变量:

全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件
全局变量具有全局作用域。,它只编译期被始化一次,它不能用变量来初始化。全局变量只需要在一个源文件中定义,就可以作用于所有的源文件。在其他不包含全局变量定义的源文件中需要用extern关键词来再次声明这个全局变量

例如在单个.c文件中

 int a, b;  //全局变量
 void func1(){
     //TODO:
 }
 float x,y;  //全局变量
 int func2(){
     //TODO:
 }
  int main(){
     //TODO:
     return 0;
 }
 int a, b;  //全局变量
 void func1(){
      //TODO:
  }
  float x,y;  //全局变量
  int func2(){
     //TODO:
 }
  int main(){
     //TODO:
     return 0;
}

上面的变量a,b就是全局变量。在有的时候,项目是进行划分的,会有不同个.c文件的出现,如果在不同.c中出现例如变量a、b这样的变量,

局部变量:

局部变量只有局部作用域,它只在函数调用执行期间存在,函数一次调用执行结束后,变量被撤销,其所占用的的内存也被回收

例如:

int f1(int a){
    int b,c;  //a,b,c仅在函数f1()内有效
    return a+b+c;
}
int main(){
    int m,n;  //m,n仅在函数main()内有效
    return 0;
}

静态全局变量:

静态全局变量具有全局作用域,,它只编译期被始化一次,它不能用变量来初始化。它作用于定义它的文件里,不能作用到其它的文件里。这样即使多个不同的源文件定义了同名的静态全局变量,他们也是不同的变量。

静态局部变量:

静态局部变量只有局部作用域,它只编译期被始化一次,它不能用变量来初始化。在它初始化之后便一直存在,直到程序运行结束。它与全局变量的区别是:全局变量是对所有的函数是可见的,而静态局部变量只对定义自己的函数体始终可见。

宏:

宏定义又称为宏代换、宏替换,简称“宏”。在预编译(即宏展开)阶段使用具体的内容替换宏名,预编译过程是不做语法检查的,这样导致在宏在程序中出错不好判断。

宏与变量的区别:

  1. 宏定义不分配内存,变量定义需要分配内存
  2. 宏不分数据类型,变量区分数据类型。
  3. 宏定义之后值是不能改变的,变量的值是可以改变的

宏与const常变量的区别:

  1. 宏系统不为它分配内存,const定义的常量系统为它分配内存
  2. 宏在预编译阶段直接进行替换过,不进行数据类型及语法的检验, const定义的常量在编译时进行严格的类型和语法检验,可以避免出错。

分配内存空间:

分配内存空间:

局部变量分配在栈空间;

全局变量、静态变量都分配在静态存储区;

宏不分配内存空间

[转]原文地址

其他参考:https://blog.csdn.net/qq_39490500/article/details/79402320

//函数声明未给出时编译器默认猜它是int 型的函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值