一 、存储类

在理解C的存储类之前,首先要搞懂的概念有:作用域、生存周期、连接属性

C中的存储类说明符实际上是上述属性的不同组合

作用域:一个C变量的作用域可以是

代码块作用域(在函数内部代码块中定义的变量、形参,称为局部变量),

函数原型作用域(从变量定义处一直到原型声明的末尾),

文件作用域(一个在所有函数之外定义的变量,从定义处到包含定义的文件结尾处都可见,称为全局变量),

函数作用域(只适应于goto语句使用的标签),函数作用域意味着一个特定函数中的goto标签对该函数中任何地方的代码都是可见的,无论该标签出现在哪一个代码块中。

连接:一个C变量具有以下连接之一

外部连接

内部连接

空连接

具有代码块作用域和函数原型作用域的变量是空连接,由定义所在的代码块和函数原型所私有

具有外部连接的变量可以在多文件程序的任何地方使用,多个文件可有共享。

具有内部连接的变量可以在一个文件的任何地方使用,归该文件私有。

具有文件作用域的变量可能是内部连接或者外部连接。

如果一个具有文件作用域的变量用static修饰,则是内部连接,否则是外部连接。

存储时期:一个C变量具有以下两种存储时期之一,静态存储时期(在程序执行期间一直存在)和自动存储时期

静态存储时期:在程序执行期间一直存在。具有文件作用域(不管是内部连接还是外部连接)的变量具有此存储周期,注意对于具有文件作用域的变量,static标明连接类型不是存储时期。

自动存储时期:具有代码块作用域的变量一般是自动存储周期。在程序进入定义的变量代码块中时在栈中分配内存,退出时释放内存。

自动变量:用auto修饰或者不修饰就默认属于自动存储类的变量,具有自动存储周期、代码块作用域、空连接。在默认下,在代码快或者函数的头部定义的任意变量都属于自动存储类。

如果在内层中使用和外层一样名字的变量,则内层会覆盖外层变量,在程序离开内层代码块时,外部变量就恢复了其作用和之前的值。

对于自动变量,除非显式的初始化,否则不会自动初始化。

寄存器变量:通过register声明,放在寄存器而非内存中,所以无法获得其地址。注意,有时候虽然请求了把变量放于寄存器中,但是由于寄存器的个数,并不一定能满足,所以寄存器变量就成为了普通变量,不过依然不能对其取址。

具有代码块作用域的静态变量:通过static修饰,如果不现实对其初始化,则自动初始化为0(提供了静态时期),在代码块内声明(提供了代码块作用域和空连接),创建具有代码块作用域兼具静态存储的局部变量。这些变量具有代码块作用域,空连接,静态存储时期。变量一旦被定义便一直存在直到程序结束。

Int main(void)
{
Int count;
For(count = 1;conut < 4;count ++)
{printf(”count = %d\n”,count);
F();}
Return 0;
}
Void F(void)
{
Int fade = 1;
Static int stay = 1;
Printf(“fade = %d and stay = %d\n”,fade++,stay++);
}
结果:
Count = 1
Fade = 1 and stay = 1;
Count = 2
Fade = 1 and stay = 2;
Count = 3
Fade = 1 and stay = 3;

这是因为静态变量和外部变量在程序调入内存时已经就位了,把这个语句放在f()中是为了告诉编译器只有函数f()能看到该变量。

具有外部连接的静态变量:具有文件作用域、外部连接、静态时期(外部存储类,外部变量)。

额外说明,外部变量只可进行一次初始化,而且在定义的时候。

具有内部连接的静态变量:用static在所有函数的外部进行定义来创建,静态存储时期、文件作用域、内部连接。

二、存储类说明符

Auto 标明一个变量具有自动存储时期,该说明符只能用在具有代码块作用域的变量声明中。

Register 只能用在具有代码块作用域的变量。请求一个变量存储在寄存器中一边快速使用,但是不能获得改变量的地址。

Static 用于具有代码块作用域的变量声明时,使该变量具有静态存储时期,从而得以在程序运行期间存在并保留其值,变量仍保留代码块作用域和空连接。若用于具有文件作用域的变量声明时,使该变量具有内部连接。

Extern 表明在声明一个在其他地方定义了的变量。

Const 将数据定为不变的,在只能定义声明,以后不可改变其值。在指针中使用时,const的位置决定是指针本身不变还是指针指向的数据不变。

Volatile 说明数据除了可以被程序修改外还可以被其他代理修改,主要用于编译器优化。

Restrict 只能用于修饰指针,限定的指针被认为是提供了对其所在指向的数据块的唯一访问途径。

搜索

复制

新手小白入门C语言第五章:C存储类的更多相关文章

  1. 新手小白入门C语言第四章:变量与常量

    C 变量 变量其实只不过是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和 ...

  2. 新手小白入门C语言第六章:C运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 小编将会为大家逐一介 ...

  3. 新手小白入门C语言第三章:关于数据类型

    C 语言包含的数据类型 1.整型 整型分为整形常量和整形变量,常量就是我们平时所看到的准确的数字,例如:1.20.333等等,变量则按我的理解是我像内存去申请一个存储空间,告诉内存空间我申请了这个地方 ...

  4. 新手小白入门C语言第二章:基本语法

    1. 语句 C 语言的代码由一行行语句(statement)组成.语句就是程序执行的一个操作命令.C 语言规定,语句必须使用分号结尾,除非有明确规定可以不写分号. 如: int x = 1; 这就是一 ...

  5. ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第五章_ArcCatalog使用 - ArcGIS知乎-新一代ArcGIS问答社区 1 ArcCatalog使用 1.1 GIS数据 地理信息系统, ...

  6. D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

    D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...

  7. C++编程学习(五) C++ 存储类

    一.auto 存储类 根据初始化表达式自动推断被声明的变量的类型. auto f=3.14; //double auto s("hello"); //const char* aut ...

  8. 新手入门C语言第七章:C判断

    C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C 语言把任何非零和非空的值假定为 true,把零或 null  ...

  9. Node入门教程(6)第五章:node 模块化(上)模块化演进

    node 模块化 JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理.所以并没有模块化的规范设计. 项目小的时候,我们可以通过命名空间.局部作用域.自执行函数等手段实现变量不 ...

随机推荐

  1. Spring——初识

    1.1 使用 导包:Spring Web MVC(maven) <!-- https://mvnrepository.com/artifact/org.springframework/sprin ...

  2. json知识点总结(一)--基础介绍

    前言 JSON是一种轻量化的数据编码方式它不依赖于编程语言是独立的文本格式.和xml相比JSON具有格式简洁,转译速度快的特点,因此现在被广泛使用.JSON的本质是字符串,采用了特定的分隔方式对字符串 ...

  3. 关于.NET 6.0 Crossgen2的一些研究

    NET 6.0引入了Crossgen工具的后续版本Crossgen2,这个工具提供了程序提前(AOT)编译的能力. 什么是CrossGen? 我们日常开发时使用C#编译器CSC编译一个.NET程序集, ...

  4. 记录NLTK安装使用全过程--python

    前言 之前做实验用到了情感分析,就下载了一下,这篇博客记录使用过程. 下载安装到实战详细步骤 NLTK下载安装 先使用pip install nltk 安装包 然后运行下面两行代码会弹出如图得GUI界 ...

  5. zk 节点宕机如何处理?

    Zookeeper 本身也是集群,推荐配置不少于 3 个服务器.Zookeeper 自身也要保 证当一个节点宕机时,其他节点会继续提供服务. 如果是一个 Follower 宕机,还有 2 台服务器提供 ...

  6. @Autowired 注解?

    @Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配.它的用法和@Required一样,修饰setter方法.构造器.属性或者具有任意名称和/或多个参数的PN方法.

  7. Java并发机制(9)--Callable、Future、FutureTask的使用

    Java并发编程:Callable.Future.FutureTask的使用 整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3949310.html ...

  8. mybatis 自定义插件的使用

    今天看了别人的mybatis的教学视频,自己手写了一个简单的自定义的插件,有些细节记录一下. 先看下mybatis的插件的一些说明: MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用. ...

  9. java-面向对象相关

    public class DemoMethodOverload { public static void main(String[] args) { int[] array = new int[]{1 ...

  10. java-等待唤醒机制(线程中的通信)-线程池

    为什么需要线程间的通信 多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且 希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共 ...