一 、存储类

在理解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. CSV格式的文件与EXCEL文件的区别

    CSV格式的文件与EXCEL文件的区别 Excel CSV 这是一个二进制文件,它保存有关工作簿中所有工作表的信息 CSV代表Comma Separated Values .这是一个纯文本格式,用逗号 ...

  2. vue学习过程总结(07) - vue的后台服务API封装及跨域问题的解决

    以登录流程为例说明接口的封装. 1.登录调用后台的登录api 登录界面的代码 <template> <div class="login-page"> < ...

  3. 配置Openfiler做ISCS实验

    在VMware workstation中安装openfiler(linux底层)   系统安装 选择redhat6,64bit   分配30G 2.   3.. 4.5.               ...

  4. Linux(centos7)安装RabbitMQ

    由于RabbitMQ是由Erlang语言开发的,所以我们需要体检安装erlang语言的环境 下载这三个安装包:https://www.aliyundrive.com/s/4AxfTepHjMD 执行安 ...

  5. mysql索引失效原理(联合索引失效问题)

    单值索引B+树图单值索引在B+树的结构里,一个节点只存一个键值对 联合索引开局一张图,由数据库的a字段和b字段组成一个联合索引. 从本质上来说,联合索引也是一个B+树,和单值索引不同的是,联合索引的键 ...

  6. 接口是否可继承(extends)接口?抽象类是否可实现 (implements)接口?抽象类是否可继承具体类(concrete class)?

    接口可以继承接口,而且支持多重继承.抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类.

  7. Java 中,Maven 和 ANT 有什么区别?

    虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多, 在基于"约定优于配置"的概念下,提供标准的 Java 项目结构,同时能为应用自 动管理依赖(应用 ...

  8. ModelSerializer序列化器实战

    目录 ModelSerializer序列化器实战 单表操作 序列化器类 视图类 路由 模型 多表操作 models.py serializer.py views.py urls.py ModelSer ...

  9. kali Linux 渗透测试 | ARP 欺骗

    目录 ARP 欺骗及其原理 ARP 欺骗实施步骤 必备工具安装 nmap 工具 dsniff 工具 driftnet 工具 ettercap 工具 ARP 欺骗测试 ARP 断网攻击 ARP 欺骗(不 ...

  10. Anaconda 怎么安装cv2

    Anaconda run python程序的时候,如果有import cv2, 但是遇到报错的时候, 可以考虑在anaconda 中安装opencv, 安装过程非常简单. 什么是opencv , op ...