c语言中变量的储存类型有以下四种

auto  如果没有定义储存类型  默认就是这个类型  比如  int a = 10;  储存类型就是 auto;编译器会跟你定义的位置,以及用途,自动帮你决定使用那种储存类别;

如果你定义在函数内 ,那么编译器就把他当做局部变量,如果定义在函数外部,编译器把他归为全局变量,如果这个变量用作 循环因子(for循环中 i );编译器就把他

定义为寄存器变量;

register  寄存器变量,用作循环因子等使用频率极高的变量

extren  全局变量  *从定义的位置开始* 在整个程序执行期间有效,如果这个程序是多文件的,那么在其他文件中也可以使用这个变量;

无论是局部变量还是全局变量,一般都不显示的指明,有编译器来自动区分就好了;

【局部变量 和全局变量的区别】:

全局变量:(生命周期)在程序执行期间有效,(作用域)从定义起本文件和其他文件都可以引用

局部变量:(生命周期)函数执行完就从内存中销毁,(作用域)在函数内有效

static  静态变量 ,可以修饰局部变量和全局变量  ; 上面通过作用域和生命周期对比了局部变量和全局变量,那么加上static关键字修饰后有什么变化呢?

[static 全局变量]:(生命周期)在程序执行期间有效,(作用域)作用域缩小了,只有本文件可以引用,其他文件不能引用了

[static 局部变量]:(生命周期)生命周期变了,在整个程序期间有效,(作用域)还是在函数内有效

看个例子:

#include <stdio.h>

void test() {

    static int t = ;
printf("%d\n",t++);
} int main(void) { test(); //
test(); //
test(); //
}

如果  去掉static修饰 那么test函数每次打印的都是 3;

值得注意的是,虽然加了static修饰后,t的生命周期变长了(不会因为test执行完就销毁),但是t的作用域还是没有变的,尝试在 main函数里面打印t的值报错;

这个例子其实可以用全局变量t来实现,效果是一样的,那么为什么还需要static关键字呢?

有两个 因素:

(1) 全局变量存放在内存中,而局部变量存放在寄存器中,运行速度相差很大; (这一点不是主要的因素)

(1) 全局变量如果没有加 static的话,在多文件程序里面  多个文件可以读取到这个变量,容易造成变量重名,但是有些时候 有的变量需要在整个文件中都有效又必须要全局变量才能行,

那么加上static关键字就可以两者兼得了,既定义了全局变量,在多文件程序中又不用担心变量重复,适合封装单独的功能模块;

static类型的变量的更多相关文章

  1. 【C++】const,static和static const类型成员变量声明及其初始化

    1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...

  2. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  3. static 类成员变量 和 static const类成员变量

    1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...

  4. C# 类型和变量

    C# 中的类型有两种:值类型 (value type) 和引用类型 (reference type).值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象.对于引用类型 ...

  5. java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。

    /*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog {               ...

  6. 用static声明外部变量与内、外部函数

    1.用static声明外部变量 若希望某些外部变量只限于被本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明. 例:(file1.c) #include <stdafx ...

  7. C#指南,重温基础,展望远方!(3)类型和变量

    C# 有两种类型:值类型和引用类型. 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用.对于引用类型,两个变量可以引用同一对象:因此,对一个变量执行的运算可能会影响另一个变 ...

  8. C#3.0新增功能03 隐式类型本地变量

    连载目录    [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...

  9. C#详解类型,变量与对象

    本节内容: 1.什么是类型(Type) 2.类型在C#语言中的作用 3.C#语言的类型系统 4.变量.对象与内存 1.什么是类型(type) 类型又名数据类型(Date Type),是数据在内存中存储 ...

随机推荐

  1. Csharp—碎片知识积累

    1.获取应用程序的工作目录 2.将两个字符串组成一个新的路径: 3.MessageBox使用(弹出一个消息框)(第一个参数是消息内容,第二个参数是消息标题,第三个参数是按钮设置,第四个参数是消息内容前 ...

  2. WPF(一)

    什么是WPF WPF(Windows Presentation Foundation)是用于Windows的现代图形显示系统.与之前出现的技术相比,WPF发生了根本性变化.WPF引用了"内置 ...

  3. Git中删除指定文件

    之前的博客Git基础使用教程介绍了Git这个开源分布式管理系统的一些基础操作,这篇博客,介绍下如何利用Git删除远程仓库的文件... 1.拉取远程仓库的文件到本地 git clone xxx 如果还未 ...

  4. vue项目使用echarts按需引入实现地图动态显示效果时,报错:TypeError: Cannot read property 'dataToPoint' of undefined

    vue项目使用echarts按需引入实现地图动态显示效果时,报错:TypeError: Cannot read property 'dataToPoint' of undefined 借鉴了该大神的文 ...

  5. 阿里巴巴2017实习生招聘模拟题(部分)---C++后台开发方向

    1.一个机器人玩抛硬币的游戏,一直不停的抛一枚不均匀的硬币,硬币有A,B两面,A面的概率为3/4,B面的概率为1/4.问第一次出现连续的两个A年的时候,机器人抛硬币的次数的期望是多少? 9/4 11/ ...

  6. Python-random模块-59

    random模块: 随机数模块 >>> import random #随机小数 >>> random.random() # 大于0且小于1之间的小数 0.76643 ...

  7. Python_%---format_43

    fat39 博客园 首页 新随笔 联系 订阅 管理 随笔 - 142  文章 - 0  评论 - 0 python基础_格式化输出(%用法和format用法)   目录 %用法 format用法 %用 ...

  8. hibernate坑边闲话

    使用hibernate各种各样的坑 Remember that ordinal parameters are 1-based node to traverse cannot be null 这两个错误 ...

  9. webapack

    webpack  就是一个前端资源加载.打包工具. 核心思想:会根据(js css less文件)模块依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,减少页面请求. wapack ...

  10. 批量采集世纪佳缘会员图片及winhttp异步采集效率

    原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同 ...