关键字static、Const、Volatile的作用是什么

2023-11-11

关键字static的作用是什么?

在C语言中,关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用结束后不释放其存储空间。定义为static的局部变量的存储在全局区(静态区)而一般的局部变量存储在栈中。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4). 类中定义的static数据成员属于所有该类对象共享,在内存中只占一份空间,而不是每个对象都分别为它保留一份空间。
5).类中定义为static的成员函数只能直接调用static数据成员,若要访问非静态数据成员,需要加上对象名。因为静态成员函数没有this指针。

关键字const是什么含意?
const意味着“只读”。
下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * const a ;

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

关键字volatile有什么含意
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量

1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}




原文链接 http://blog.sina.com.cn/s/blog_725dd1010100txwb.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关键字static、Const、Volatile的作用是什么 的相关文章

随机推荐

  • java 动态加载class文件路径_Java动态加载jar及class文件

    经常碰到需要动态加载jar及class文件的场景 Java类由于需要加载和编译字节码 动态加载class文件较为麻烦 但JDK仍提供了一整套方法来动态加载jar文件和class文件 一 动态加载jar 系统类库路径 File libPath
  • 对象存储OSS简介,一分钟了解对象存储OSS

    对象存储 Object Storage 是一种新兴的数据存储方式 与传统的文件系统和块存储不同 对象存储以对象为基本单位进行数据管理和存储 在对象存储中 每个对象都有唯一的标识符 并包含了数据本身以及与之相关的元数据 如文件名 文件类型 创
  • 老猿学5G扫盲贴:PDU协议数据单元、PDU连接业务和PDU会话的功能详解

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 PDU 关于PDU在百度百科是这样定义的 协议数据单元PDU Protocol Dat
  • java基础之日期与字符串的任意转换

    目录 前言 日期转字符串 1 创建日期对象 2 创建字符串的格式化模版 字符串转日期 前言 本文主要讲述如何将日期类型转化为字符串类型 以及将字符串类型转化为日期类型 一看就懂 一学就会 日期转字符串 1 创建日期对象 LocalDate
  • 2.7时间管理------------2.7.1基本概念

    1 物理系统 被仿真的实际或想象的系统 物理系统组成了真实的世界 2 仿真系统 就是对物理系统的模拟 是个虚拟世界 3 物理时间 真实世界中的自然时间 4 仿真时间 仿真世界里的时间 也称逻辑时间 5 墙上时钟时间 仿真世界里的参考时间 它
  • 数据结构:常见算法的时间复杂度汇总

    目录 顺序表 链表 二叉树 图 V是顶点个数 E是边的条数 1 存储空间 2 BFS和DFS的时间复杂度 3 最小生成树时间复杂度 4 最短路径时间复杂度 查找的平均查找长度 ASL 排序 顺序表 算法操作 时间复杂度 空间复杂度 描述 插
  • QT Creator的style sheet的几种用法(QT Creator)(StyleSheet)(样式)(QT4.7)(用法)

    摘要 QT Create中 对button或者window等部件设置背景 颜色 透明等样式时 需要用到style sheet 可以直接在代码里写 也可以在ui设计师里通过右键change style sheet的方法来设置 本人是使用的后面
  • 一种基于遗传算法与神经网络算法(GA-BP)的新冠肺炎模型预测-含Matlab代码

    目录 一 引言 二 新冠肺炎模型构建 三 遗传算法反向传播 GA BP 神经网络设计 3 1 GA BP 神经网络构建 3 2 BP神经网络训练 3 3 基于遗传算法的新冠感染人数峰值预测 四 结论 五 Matlab代码获取 一 引言 针对
  • jackson中自定义处理序列化和反序列化

    http jackyrong iteye com blog 2005323 对于一直用gson的人来说 如果单独用jackson 真是麻烦了 但还是得小结下了 先来看下如何自定义把某个对象序列化为json 先是对象 Java代码 publi
  • Flink实时计算性能分析

    本文从数据传输和数据可靠性的角度出发 对比测试了Storm与Flink在流处理上的性能 并对测试结果进行分析 给出在使用Flink时提高性能的建议 Apache Storm Apache Spark和Apache Flink都是开源社区中非
  • 19_SpringBoot拓展注解@SpringBootApplication和@Configuration

    文章目录 Spring Boot拓展注解 SpringBootApplication和 Configuration 0x01 SpringBootApplication SpringBootConfiguration EnableAutoC
  • 第十七节 多线程(二)购票经典案例+单例设计模式

    1 多线程案例 这是一个经典的多线程案例 火车票售票案例 需求 假设一共100张火车票 多个窗口去售卖 想一想 在现实中是如果买票的 需要注意哪些事项 1 1 窗口售票 1 1 1 方式一 继承 Thread 类 第一种继承Thread方式
  • C# LINQ的基础使用方法

    关键字 from in where select orderby descending 例子 Linq的简单运用 1 用Linq查询集合中所有符合条件的内容 表达式写法 var result from temp 临时变量 in myList
  • 技术调研报告

    如何做好技术调研 了解需求 首先你肯定要足够了解需求 然后才能确定一个技术调研方向 一定要确定好要求 准确分析出需要准备的技术点 再进入下一步 需要技术调研的场景包括但不限于以下三个方面 新技术 资料较少 社区不完备 足够成熟 但不确定细节
  • 博客园Markdown编辑器代码高亮失效(官方已修复)

    刚来博客园写文章 插入代码功能总是会失效 Markdown编辑器 找了半天原因 多数情况是因为代码中有空行 正确的插入方法 php echo 不要有空行 失效的插入方法 php echo 第一行空的 使用 TinyMCE编辑器则没有这个空行
  • java计算二叉树的节点最小值_求二叉树根节点到叶子节点路径和的最小值:遍历(递归+非递归)...

    昨晚中兴笔试题 第一题是给定二叉树 每个节点的数据结构是 value left right 比较根节点到各个叶子节点路径和的大小 输出路径和的最小值 补充 用ArrayList可以存储 以前没做过关于树的题 所以没想到如何处理各个节点的左右
  • Ubuntu 下安装类似记事本的工具Geany

    Geany同样也是一个类似Komode Edit的编辑器 下载方式 1 Ubuntu软件中心中搜索Geany安装 2 我已第二种方式为例 输入ctrl alt t的组合快捷键 在终端中输入 sudo apt get install gean
  • Docker compose

    文章目录 Docker compose 1 介绍 2 为什么要 Docker Compose 3 Docker Compose 文件 docker compose yml image command entrypoint environme
  • Spring-statemachine实现订单状态机

    状态机简介 先从状态机的定义入手 StateMachine 其中 StateMachine 状态机模型 state S 状态 一般定义为一个枚举类 如创建 待风控审核 待支付等状态 event E 事件 同样定义成一个枚举类 如订单创建 订
  • 关键字static、Const、Volatile的作用是什么

    关键字static的作用是什么 在C语言中 关键字static有三个明显的作用 1 在函数体 一个被声明为静态的变量在这一函数被调用结束后不释放其存储空间 定义为static的局部变量的存储在全局区 静态区 而一般的局部变量存储在栈中 2