一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域。

不推荐写法

int a; // 出现了语法的二义性,可能是声明也可能是定义,所以最好定义完成之后声明

void func(); // 出现了语法的二义性,可能有参数,也可能没参数

推荐写法(严谨写法)

int a = 0; // 明确的定义了一个变量

extern int a; // 明确的声明了一个变量,使用extern关键字明确声明一个变量

void func(void); // 明确的声明了一个函数没有任何参数

1.auto自动变量

一般情况下代码块内部定义的变量都是自动变量。当然也可以显式的使用auto关键字,代码块之内的变量都可以称作auto变量代码块之外的变量叫全局变量。所有auto变量的生命周期就是变量所在的大括号。

auto int a;

2.register寄存器变量

通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高。

register int i;

3.代码块作用域内的静态变量

静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问

static int i = 0; // 定义一个静态变量

静态变量在程序刚加载到内存的时候就出现,所以和定义静态变量的大括号无关,所以一直到程序结束的时候才从内存消失,同时静态变量的值只初始化一次。

4.代码块作用域外的静态变量

代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问,在其它文件中不能被访问,即使是使用extern声明了也不行

因为全局变量的名字是不能相同的,这样会带来一个什么问题呢?因为一个项目往往是多人写的,每个人都定义自己的全局变量,最后代码合并后会出错。但static的全局变量在不同的文件中名字是可以相同的。

5.全局变量

全局变量的存储方式和静态变量相同,但可以被多个文件访问,定义在代码块之外的变量,就是全局变量。

6.外部变量与extern关键字

extern int i; // 声明一个变量,这个变量已经在别的文件中定义了,这里只是使用,而不是定义

7.全局函数与静态函数

在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态。一旦一个函数定义为static,就意味着这个函数只能在定义这个函数的文件中使用,即使在其它文件中声明这个函数都没有用。

对于不同文件中的static函数名字可以相同。

示例1:auto变量使用Demo

#include <stdio.h> // 这个头文件在系统目录下
#include <stdlib.h> // 使用了system函数
#include <Windows.h> // auto 变量使用Demo
void autoVariableUseDemo(void); int main() { for (int i = ; i < ; i++) {
autoVariableUseDemo();
//staticVariableUseDemo();
} //printf("z=%d\n",z); system("pause");
return ; } void autoVariableUseDemo(void) { auto int n = ;
n++;
printf("n=%d\n",n); }

输出结果

 示例2:static 变量使用Demo

#include <stdio.h> // 这个头文件在系统目录下
#include <stdlib.h> // 使用了system函数
#include <Windows.h> // static变量使用Demo
void staticVariableUseDemo(void); int main() { for (int i = ; i < ; i++) {
//autoVariableUseDemo();
staticVariableUseDemo();
} //printf("z=%d\n",z); system("pause");
return ; } void staticVariableUseDemo(void) { static int n = ;
n++;
printf("n=%d\n",n);
}

输出结果

最新文章

  1. AngularJS学习笔记
  2. Java 2D API - 1. 基本概念
  3. PTA Iterative Mergesort
  4. MVC后台数据赋值给前端JS对象
  5. Auto Mapper01
  6. jquery messagetip信息语提示控件
  7. Visual Studio 2012中文旗舰版(序列号和下载地址)
  8. UliPad双击没反应,UliPad打不开
  9. 无废话ExtJs 入门教程十四[文本编辑器:Editor]
  10. C#中var和dynamic
  11. ubuntu15.04 安装搜狗输入法
  12. 【课程分享】基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构、自己定义工作流)
  13. PHP $_POST 变量
  14. Ubuntu16.04安装之后连不上无线网?有可能是Realtek rtl8822be的原因
  15. 爬微信好友签名和QQ好友签名
  16. junit,面向切面开发(动态代理),工厂设计模式,数据库连接池
  17. day-01(html)
  18. dropna(thresh=n) 的用法
  19. myeclipse项目导入到eclipse, HttpServletRequest报红现象
  20. Prometheus 初体验

热门文章

  1. 关于两数的最大公约数gcd
  2. [BZOJ 2208] 连通数
  3. 【指数型母函数】hdu1521 排列组合
  4. 【kd-tree】bzoj3290 Theresa与数据结构
  5. 【2-SAT(两次DFS版)】BZOJ1823-[JSOI2010]满汉全席
  6. python3 开发面试题(常用模块以及第三方库)6.5
  7. 微服务之SpringCloud实战(五):SpringCloud Eureka详解
  8. jvm-监控指令-jinfo
  9. ethtool 命令输出的注意点--网卡参数
  10. linux下分区相关知识