在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储。可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto)、静态(static)、寄存器(register)和外部(extern)4种。


一、静态存储与动态存储

根据变量的产生时间,可将其分为静态存储和动态存储。

静态存储是指程序运行时为其分配固定的存储空间,动态存储则是在程序运行期间根据需要动态地分配存储空间。


二、auto变量

auto关键字用于定义一个局部变量为自动的,这意味着每次执行到定义该变量时,都会产生一个新的变量,并且对其重新进行初始化

关键字auto时可以省略的,如果不特别指定,局部变量的存储方式默认为自动的

#include <stdio.h>
#include <stdlib.h>void add_one(void)
{auto int num = 1; /*定义auto整型变量*/num = num + 1; /*变量加1*/printf("%dn", num); /*显示结果*/
}int main(void)
{printf("第一次调用:");add_one(); /*调用add_one函数*/printf("第二次调用:");add_one(); /*调用add_one函数*/return EXIT_SUCCESS; /*程序结束*/
}

运行结果:

auto变量

源码地址:https://github.com/Hyacinth-fjk/CombinedLanguageIntroduction/blob/master/5.C%E8%AF%AD%E8%A8%80%E5%8F%98%E9%87%8F%E7%9A%84%E5%AD%98%E5%82%A8%E7%B1%BB%E5%88%AB/auto_variable.c


二、static变量

static变量为静态变量,将函数的内部变量和外部变量声明成static变量的意义是不一样的。不过对于局部变量来说,static变量是和auto变量相对而言的。尽管两者的作用域都仅限于声明变量的函数之中,但是在语句块执行期间,static变量将始终保持它的值,并且初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值。

#include <stdio.h>
#include <stdlib.h>void add_one(void)
{static int num = 1; /*定义static整型变量*/num = num + 1; /*变量加1*/printf("%dn", num); /*显示结果*/
}int main(void)
{printf("第一次调用:");add_one(); /*调用add_one函数*/printf("第二次调用:");add_one(); /*调用add_one函数*/return EXIT_SUCCESS; /*程序结束*/
}

运行结果:

static变量

源码地址:https://github.com/Hyacinth-fjk/CombinedLanguageIntroduction/blob/master/5.C%E8%AF%AD%E8%A8%80%E5%8F%98%E9%87%8F%E7%9A%84%E5%AD%98%E5%82%A8%E7%B1%BB%E5%88%AB/static_variable.c


三、register变量

register变量称为寄存器存储类变量。通过register变量,可以把某个局部变量指定存放在计算机的某个硬件寄存器中,而不是内存中。这样做的好处是可以提高程序的运行速度。实际上,编辑器可以忽略register对变量的修饰

用户无法获得寄存器变量的地址,因为绝大多数计算器的硬件寄存器都不占用内存地址。而且,即使编辑器忽略register,而把变量存放在可设定的内存中,也是无法获取变量的地址的。

如果想有效地利用register关键字,必须像汇编语言那样了解处理器的内部结构,知道可用于存放变量的寄存器的数量、种类以及工作方式。但是,不同的计算机对于这些细节可能是不同的,因此,对于一个要具备可移植的程序来说,register的作用并不大

#include <stdio.h>
#include <stdlib.h>int main(void)
{register int num = 100; /*定义寄存器整型变量*/printf("%dn", num); /*显示结果*/return EXIT_SUCCESS; /*程序结束*/
}

运行结果:

register变量

源码地址:https://github.com/Hyacinth-fjk/CombinedLanguageIntroduction/blob/master/5.C%E8%AF%AD%E8%A8%80%E5%8F%98%E9%87%8F%E7%9A%84%E5%AD%98%E5%82%A8%E7%B1%BB%E5%88%AB/register_variable.c


四、extern变量

extern变量称为外部存储变量。extern声明了程序中将要用到但尚未定义的外部变量。通常,外部存储类都用于声明在另一个装换单元中定义的变量。

一个工程是由多个C文件组成的。这些源代码文件分别编译,然后链接成一个可执行模块。把这样的一个程序作为一个工程进行管理,并且生成一个工程文件来记录所包含的所有源代码文件。

extern_variable_main:

#include <stdio.h>
#include <stdlib.h>int main(void)
{extern int num; /*定义外部整型变量*/printf("%dn", num); /*显示变量值*/return EXIT_SUCCESS; /*程序结束*/
}

extern_variable:

int num = 100; /*定义一个整型变量,为其赋值为100*/

运行结果:

extern变量

源码地址:https://github.com/Hyacinth-fjk/CombinedLanguageIntroduction/blob/master/5.C%E8%AF%AD%E8%A8%80%E5%8F%98%E9%87%8F%E7%9A%84%E5%AD%98%E5%82%A8%E7%B1%BB%E5%88%AB/extern_variable_main.c、https://github.com/Hyacinth-fjk/CombinedLanguageIntroduction/blob/master/5.C%E8%AF%AD%E8%A8%80%E5%8F%98%E9%87%8F%E7%9A%84%E5%AD%98%E5%82%A8%E7%B1%BB%E5%88%AB/extern_variable.c

C语言变量的存储类别https://www.zhihu.com/video/1194951082491768832

视频下载地址:https://pan.baidu.com/s/1PSvTmX09xsh-Kv9CXvA_2Q

存储过程debug值not a variable_C语言变量的存储类别相关推荐

  1. C语言变量的存储类别和生存期

    C语言变量的存储类别和生存期 我们知道,变量是有数据类型的,用来说明他占用多大的内存空间,可以进行什么操作. 除了数据类型,变量还有一个属性,称为"存储类别".存储类别就是变量在内 ...

  2. c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍

    描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...

  3. C语言变量的存储方式和生存期

    一.动态存储方式与静态存储方式 从变量的作用域进行区分,变量可分为全局变量和局部变量. 从变量的生存期进行区分,变量可分为静态存储方式和动态存储方式. 静态存储方式:在程序运行期间由系统分配固定的存储 ...

  4. c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...

    7.7 变量的存储类别.作用域及生存期 1.变量的存储类别 在C语言中,有两类存储类别:自动类别及静态类别. 有4个与两种存储类别有关的说明符:auto(自动).register(寄存器).stati ...

  5. C语言 | 变量的存储方式

    C语言动态存储方式与静态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式:动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式. 内存中的供用户使用的存储空间可以分为 ...

  6. C语言中局部变量和全局变量 变量的存储类别

    C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register)   局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用 ...

  7. C语言基本类型和存储类别

    基本类型 C语言的基本数据类型分为两大类:整数类型和浮点数类型.不同的种类提供了不同的范围和精度. 关键字 1. 创建基本数据类型要用到8个关键字:int.long.short.unsigned.ch ...

  8. 【转载】变量的存储类别

    转载自:http://edu.cnzz.cn/852996fd.html 一.动态存储方式与静态存储方式 上一节已介绍了变量的一种属性--作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量. ...

  9. 变量的存储类别以及作用空间

    从变量值存在的时间角度划分,可以把变量划为静态存储空间和动态存储空间. 所谓静态存储空间是指在程序运行期间分配固定的存储空间的方式.而动态存储空间是在程序运行期间根据需要动态分配存储空间. 内存中供用 ...

最新文章

  1. mysql查询当天所有数据sql语句
  2. 小辣椒p60手机怎么样_小辣椒双机来临,搭载联发科 最低499元
  3. .net生成文字图片
  4. 安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页
  5. 操作系统复习笔记 02-03 OS Structure 操作系统结构
  6. ARM MOV和 LDR指令关系
  7. sql学习之笔记(时间)季度的第一天
  8. 人工智能无孔不入,电梯按键成危险区?试试用语音控制
  9. explain ref_explain的属性详解与提速百倍的优化示例
  10. 【专利提交】个人通过CPC客户端网上提交专利文稿的完整流程
  11. 【新版】掩日免杀windows Defender
  12. Linux:dperf---100Gbps开源压力测试工具
  13. ANSYS Electronics Desktop 19.2电机仿真思路
  14. Selenium.Chrome.ChromeDriver指纹去除
  15. 杰奇php手机登陆自动跳转,杰奇cms电脑与手机自动判断跳转代码
  16. Unity官方案例之星际航行游戏(Space Shooter)学习总结
  17. python_获取两个数,打印中间值
  18. 结合webpack 一步一步实现懒加载的国际化简易版方案
  19. MySQL查询优化利刃-EXPLAIN
  20. Python界面编程第八课:Pyside2 (Qt For Python)打开关于窗口

热门文章

  1. 我常用的Eclipse插件
  2. 14个数据库的设计技巧 (来自Blogcn中我的窝)
  3. apache属于哪个公司
  4. 安全挑战和SD-WAN解决方案
  5. 5G服务可以解决的4个企业WAN挑战 - vecloud
  6. SELECT ANY DICTIONARY
  7. 【好文共分享】关于ora-04065和ora-04068的原理解释
  8. Dapper官方教程翻译8:Dapper方法之QueryMultiple(转)
  9. log4j警告:WARN Please initialize the log4j system properly 的解决方法
  10. 大话设计模式C++版——装饰模式