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. Python+Pycharm—学习—pip

    1.pip是干什么的? 2.pip怎么安装? 3.pip怎么用?

  2. pyspider环境部署1--python3安装

    爬虫是一个既好玩又好用的东西,接触它有1年多了,了解一些,算不上精通.爬过新闻.微信公众号,主要用pyspider,scrapy也了解过,python2和3都尝试过.公司业务规模不大,基于 pytho ...

  3. c++面经积累<1>

    引用和指针 指针是一个实体,需要分配内存空间,而引用只是一个别名,不需要分配内存空间 指针可以有多级,而引用只能有一级. 指针和引用的自增运算不一样,指针是指向下一个空间,而引用是引用的变量值增加 s ...

  4. (admin.E108) The value of 'list_display[4]'报错解决方案

    参考资料:虫师-<web接口开发与自动化测试:基于python语言> 日常学习Django框架中,创建了用户模型,但是页面功能验证时候,提示不能进行列表字段操作,debug好久,才找到问题 ...

  5. SQL Server 跨服务器查询

    select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=10.10.10.10;User ID=sa;Password=123456'). [CF ...

  6. element ui主题色跟换

    node_modules\ element ui\ lib\ theme-dafault  下载的主题色替换掉改文件... ================== 但是会出现  搜索框iocon 样式换 ...

  7. Median String CodeForces - 1144E

    You are given two strings ss and tt, both consisting of exactly kk lowercase Latin letters, ss is le ...

  8. 软件工程(FZU2015) 赛季得分榜,第七回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  9. echarts使用笔记四:双Y轴

    1.双Y轴显示数量和占比 app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : '数量和占比图 ...

  10. Docker常规防止容器自动退出

    [root@server-crm /]# docker attach songheng [root@fc0a891e1861 /]# cat /bin/auto_service.sh #!/bin/s ...