const、volatile与static

2023-11-17

一、const

const修饰的变量是常变量,是不期望被修改的变量。我们如果要对它直接进行修改,程序编译时就会报错。可是,这个变量是可以被间接修改的:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  const int a = 10;
  int *tmp = (int *)&a;
  *tmp = 20;                 //通过地址访问这个变量就可以修改掉它
  printf("a=%d\n", a);
  return;
}


可是当我们对这段代码进行二级优化编译时,就会发现打印出来的值并没有被改变,这是为什么呢?


编译器在编译代码时会对代码进行优化,这时候由于被const修饰的变量是不期望被改变的变量,于是在优化时为了提高运行效率,可能会吧这个变量优化进寄存器,从寄存器中读取数据;而我们修改这个变量时修改的是内存中的。当我们打印时,CPU从寄存器中取的变量并没有改变。

二、volatile

上面写的const修饰的变量在编译时可能会优化进寄存器中而造成的问题,可以在const前面加上关键字volatile来解决。

#include <stdio.h>
#include <stdlib.h>
int main()
{
  volatile const int a = 10;
  int *tmp = (int *)&a;
  *tmp = 20;                 
  printf("a=%d\n", a);
  return;
}

这个关键字的作用是让编译器在编译时不优化,执行时不缓存,每次从内存中读取(保证内存的可见性)。

三、static

1、static修饰的变量可以多次赋值,但不能重复初始化。

#include <stdio.h>
#include <stdlib.h>
static int a;
void fun1()
{
  a = 0;
  a++;
  printf("a=%d\n",a);
}
void fun2()
{
  static b = 0;
  b++;
  printf("b=%d\n",b);
}
int main()
{
  int i = 0;
  for(; i < 10; i++)
  {
    fun1();
  }
  for(i = 0; i < 10; i++)
  {
    fun2();
  }
  return;
}

2、static修饰全局变量和函数时,该变量和函数只能在文件内部使用,不能被文件外调用,改变了他们的连接属性;

3、static修饰局部变量时,改变了它的存储类型和生命周期(是变量存储在静态区,不随函数调用的结束而消失),不改变其作用域和属性(变量还是只能在该函数内部使用)。








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

const、volatile与static 的相关文章

  • 欧拉操作系统

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 这个章节主要是介绍一下欧拉操作系统 欧拉系
  • 计算机基础:一颗芯片是怎样诞生的?

    一颗芯片是怎样诞生的 芯片属于半导体 半导体是介于导体和绝缘体之间的一类物质 元素周期表中硅 锗 硒 硼的单质都属于半导体 这些单质通过掺杂其他元素生成的一些化合物 也属于半导体的范畴 这些化合物在常温下可激发载流子的能力大增 导电能力大大
  • 特殊类设计

    1 请设计一个类 不能被拷贝 拷贝只会放生在两个场景中 拷贝构造函数 和 赋值运算符重载 c 98 将拷贝构造函数与赋值运算符重载 只声明不定义 并且将其访问权限设置为私有 即可 class Copyban Copyban const Co
  • 华为OD机试真题-密码解密-2023年OD统一考试(C卷)

    题目描述 给定一段 密文 字符串s 其中字符都是经过 密码本 映射的 现需要将 密文 解密并且输出 映射的规则 a i 分别用 1 9 表示 j z 分别用 10 26 表示 约束 映射始终唯一 输入描述 密文 字符串 输出描述 明文字符串
  • 华为OD机试真题-员工派遣-2023年OD统一考试(C卷)

    题目描述 某公司部门需要派遣员工去国外做项目 现在 代号为x的国家和代号为y的国家分别需要cntx名和cnty名员工 部门每个员工有一个员工号 1 2 3 工号连续 从1开始 部长派遣员工的规则 规则1 从 1 k 中选择员工派遣出去 规则
  • 华为OD机试真题-分配土地-2023年OD统一考试(C卷)

    题目描述 从前有个村庄 村民们喜欢在各种田地上插上小旗子 旗子上标识了各种不同的数字 某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民 请问 此次分配土地 做出贡献的村民中最大会分配多大面积 输入描述 第一行
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • 如何利用CHAT写C程序?

    问CHAT 用c语言编写在二维字符数组中查找某个字符串 CHAT回复 以下是一个简单的C程序 它将在二维字符数组中查找特定的字符串 c include
  • 华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

    题目描述 疫情期间 小明隔离在家 百无聊赖 在纸上写数字玩 他发明了一种写法 给出数字 个数n 和 行数m 0 lt n 999 0 lt m 999 从左上角的1开始 按照 顺时针螺旋向内写 方式 依次写出2 3 n 最终形成一个 m行矩
  • C++基础-一维和二维数组详解

    目录 定义 一维数组 二维数组 定义 数组是相同类型的对象序列 它们占据一块连续的内存区 一维数组
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • C语言—每日选择题—Day55

    第一题 1 若有如下定义 则 p1 m p2 p1 是正确赋值语句 说法是否正确 int p1 int p2 int m 5 int n A 正确 B 错误 答案及解析 A 本题考查的是对类型的认识 p1是指针类型 赋值的右操作数就必须是地
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我
  • CMake 教程

    这篇文章主要介绍 CMake 的使用 看完这篇文章后 CMake 的绝大多数使用方法你都能掌握 本篇文章采用循序渐进的方法带你一步步逐渐进阶 CMake 通过多个示例 告诉你如何使用 CMake 解决常见的构建系统问题 各位爱学习的朋友 收
  • 牛客字符串

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 带头双向循环链表基础

    带头双向循环链表基础 销毁 销毁 void ListDestory ListNode phead void ListDestory ListNode phead assert phead ListNode cur phead gt next
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使

随机推荐

  • ReactHook RefHook

    1 除了可以进行ref操作以外 还能进行数据存储的操作 即相当于在函数式组件中拥有了this 2 ref的改变不会引起组件的重新渲染 1 引入 import React Component useRef from react 2 使用ref
  • APP 抓包和微信小程序抓包-Charles 的精简使用教程

    APP 抓包和微信小程序抓包 Charles 的精简使用教程 2021 09 25 更新 2019 07 10 更新 目标 教程 一 安装 Charles 二 Charles 简介 1 Charles 欢迎页面 2 基础功能按钮 3 抓包内
  • 可视化爬虫框架spiderflow入门及实战

    官网 点击直达官网 文档 点击查看官网文档 说明 目前官网和文档均无法正常访问 原因未知 参考本文即可 再有问题欢迎留言讨论 以下内容部分来自官网或官网文档 文章比较长 请准备好瓜子和小板凳 TIP 文中用到的网站地址仅为了说明功能 如有侵
  • Android——微信登录、分享

    写在前面的话 应用要接入微信登录 分享 需要在微信的开发者平台上进行提交应用 并且审核通过 应用已经获取到appId 相关jar包下载地址 http download csdn net detail sapce fish 9571142 也
  • 链式栈(c)

    链式栈 在上节我们提到了顺序栈 而链式栈就是把顺序栈用链表的方式来存储 如果对链表和顺序栈的学习较为深刻的话 学习链式栈会非常容易 首先第一步和单链表操作基本相同 创建一个结构体 一块是数据域 另一块是指针域 用来指向下一个元素 typed
  • linux文件夹重命名

    微信可以设置雪花昵称了 真漂亮 在Linux下重命名文件或目录 可以使用mv命令或rename命令 这里分享下二者的使用方法 mv命令既可以重命名 又可以移动文件或文件夹 例子 将目录A重命名为B mv A B 例子 将 a目录移动到 b下
  • tkinter创建子窗口(只创建一个)

    import tkinter as tk 第一种直接写个类 class OneUi def init self master tk Tk self top tk Toplevel master self top geometry 600x4
  • 【直播回顾】5步实现精细化用户触达,助力业务增长

    9月17日 极光BDS产品经理刘基石通过线上直播进行了主题为 如何实现精细化的用户触达 的分享 从 用户触达的大数据 用户触达的 5 个因子 如何实现精细化触达以及精细化触达实例 4个方面 深度分享了极光如何实现精细化的用户触达 助力客户业
  • Linux Power supply子系统分析之一

    转自 http www wowotech net pm subsystem psy class overview html 1 概述 对于便携式设备 如手机或者pad来说 battery都是必不可少的一个组成部分 kernel中为了方便对b
  • IDEA-集成VisualVM插件,启动Java VisualVM

    起因 我忘了我之前起程序去关联Java VisualVM是咋配的了今天百度搜的时候意外发现idea可以直接起 只需要安装VisualVM插件然后启动Java VisualVM 安装VisualVM插件 路径 File gt Setting
  • Android四大组件-BroadcastReceiver、ContentProvider、Service

    目录 一 BroadcastReceiver 1 定义 2 作用 3 生命周期 4 广播注册方式 动态注册 静态注册 5 广播类型 普通广播 即发出广播后所有接收者都能收 有序广播 按照广播的优先级接受 broadcastReceiver可
  • Cesium.js基础使用(vue)

    如何通过Cesium创建一个地图 1 npm安装 这里使用1 95 0版本 npm i cesium 1 95 0 s 或 yarn add cesium 1 95 0 s 2 组件引入 import as Cesium from cesi
  • 使用msf获取shell

    一 获取网站webshell的前提 使用msfvenom生成exe文件通过webshell上传 msfvenom p windows x64 meterpreter reverse tcp LHOST IP LPORT 端口 f exe g
  • 目标检测Neck:FPN(Feature Pyramid Network)与PAN(附torch代码)

    文章目录 0 前言 1 FPN 1 1 FPN核心思想与步骤 1 2 FPN的融合过程 2 PAN 2 1 PANet 2 2 原版 2 3 mmdetection中yolo neck版本 2 4 nanodet版本 2 5 Pan sha
  • 矩阵、行列式

    矩阵 行列式差异 矩阵 行列式 运算结果 可看成一个表格 可看成一个数 行列数 可以不等 必须相等 两个矩阵 或行列式 相等 每个元素对应相等 结果相等即可 相加 各对应元素相加 一行 或列 元素相加 数乘矩阵 常数k乘每个元素 常数k乘一
  • java vo层_java的几种对象(PO,VO,DAO,BO,POJO)解释

    一 PO persistant object 持久对象 可以看成是与数据库中的表相映射的java对象 最简单的PO就是对应数据库中某个表中的一条记录 多个记录可以用PO的集合 PO中应该不包含任何对数据库的操作 二 VO value obj
  • RCE漏洞演示,墨者靶场

    案列演示 打开墨者靶场 黑盒 命令注入执行分析 这个功能点有这么个功能 进行类似的像我们电脑上ping命令 这相当于就满足了命令 明显可能出现命令执行漏洞 可控变量和漏洞函数都存在 第一要去分析是什么操作系统 通过查看数据包分析出来了是li
  • 计算机网络中两台机器能否通讯取决于什么,小学教师教材教法测试信息技术试题...

    小学教师教材教法测试信息技术试题 一 选择题 1 英文缩写CAI的含义是 C A 计算机辅助设计 B 算机辅助制造 C 计算机辅助教学 D 计算机辅助测试 2 计算机的基本组成部分包括 A A 输入设备 输出设备 存储器 控制器和运算器 B
  • python winerror 10065_Python报错:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。...

    Python报错 ConnectionRefusedError WinError 10061 由于目标计算机积极拒绝 无法连接 环境 windows 语言 python 故障 ConnectionRefusedError WinError
  • const、volatile与static

    一 const const修饰的变量是常变量 是不期望被修改的变量 我们如果要对它直接进行修改 程序编译时就会报错 可是 这个变量是可以被间接修改的 include