C primer plus学习笔记 —— 14、限定关键字(const、volatile、restrict、_Atomic)

news2024/11/26 10:33:37

文章目录

    • const 关键字
      • 修饰变量
      • 修饰指针
      • 修饰形参
      • 修饰全局变量
    • volatile关键字
    • restrict关键字
    • _Atomic关键字(c11)

const 关键字

修饰变量

将变量变为只读

const int nochange;
nochange = 4; //不允许
const int a = 5; //没问题

const int a[3] = {3, 5, 6};
a[0] = 4; //不允许

修饰指针

const 修饰指针变量有以下三种情况。

  1. const 修饰指针指向的内容,该指针指向的内容不可修改
  int b = 30;
  const int *q; // 使用声明一个指针,const修饰的是int型变量
  //int const *q; 同上,仅写法区别
  *q = 20; // 错误,不可以使用*q来修改值
  q = &b; // 正确,指针指向的地址是可变的
  1. const 修饰指针,则指针为不可变量,指针指向的值可以改变,但是指针指向的地址不可变
  int *const p; //声明一个指针,const修饰的是该指针
  *p = 9; // 正确,可以修改该int值
  int b = 7;
  p = &b; // 错误, 不可以修改该指针指向的位置
  1. const 修饰指针和指针指向的内容,则指针指向地址和指针指向的内容都为不可变量。
  const int *const p; //声明一个指针,const修饰的是该指针和该值
//   int a = 4;
//   const int *const p = &a; //可以初始化
  *p = 9; // 错误,可以修改该int值
  int b = 7;
  p = &b; // 错误, 不可以修改该指针指向的位置

总结:const放在星号左边,表示修饰的是该值,如果放在星号右边则表示修饰的是该指针。

修饰形参

这是最常用的使用,这个其实和上面一样。

void Cpf(const int a)
{
  a = 9; //错误,a 的值不能被改变
}

const修饰指针参数,同上面const修饰指针变量

void Cpf(int *const a , const int *c)
{
    
    int b = 4;
    //a = &b; 错误,指针不能被修改
    *a = 9; //指针指向的值可以修改

    //*c = 10; 错误,指针指向的值不可修改
    c = &b; //指针指向的地址可以修改
}
void display(const int arr1[], const int *arr2); //参数1和参数二相同,都是不能修改数组的元素的值

修饰全局变量

我们知道有全局变量,如果任何人都能使用全局变量,那将非常危险。所以一般全局变量我们给他用const修饰作为只读的,用来保障安全。
那么有两种方式来实现:

  1. 在一个文件中定义,另一个文件中使用extern声明来使用。
    在这里插入图片描述
  2. const修饰变量并用static修饰,放在一个头文件中。其他要使用的源文件包含该头文件。这里必须加static不然在不同文件中都包含就会出现重定义。
    在这里插入图片描述

volatile关键字

https://blog.csdn.net/m0_62391199/article/details/123746218
volatile 关键字修饰的变量表示可以被某些编译器,未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问
val1 = x;
val2 = x;
智能的编译器看到上面两个变量都使用了x,而并未改变该值,所以编译器把x临时存储在寄存器。val2赋值的时候,会直接从寄存器中读取x值而不是从内存中。
但是如果其他线程或者其他进程在两条语句之间修改了x的值,这时cpu就不知道该值改变还是从寄存器中读取,这读取的就是原值。

所以volatile关键字表示,每次都从内存中读取值,而不做优化,不暂存在寄存器中(和register变量做区分);

restrict关键字

_Atomic关键字(c11)

用于多线程,原子操作变量
当一个线程对一个原子变量对象执行原子操作的时候,其他线程不能访问该对象。
在这里插入图片描述
这里的赋值操作需要调用特定函数来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive--14---使用sum() over() 实现累积求和

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录Hive中使用over()实现累积求和1.总求和sum(需要求和的列) over(partition by 分组列 )数据准备需求1以地区号网点号币种 为唯一键,求总的金额需求2以地区…

python图像处理(高斯滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在谈高斯滤波之前,我们不妨回顾一下之前谈到的均值滤波和中值滤波。均值滤波,就是对像素点以及周围的8个点计算平均值,然后赋值给新像素点。而中值滤波,则是对像素点及周围的8个…

6. 初识多线程编程

1. 多线程 多线程非常重要,工作中用到的也是非常多,面试时也100%会问多线程。 关于多线程的相关知识,可以参考《计算机操作系统(第四版)》,或者自行百度查看有关文章以及视频都可以,此处不再赘述。 2. python中的多…

常用网址-2023整理

办公&效率人民币大写转换 人民币大写 人民币RMB数字转大写汉字工具我的账单 - 支付宝Bypass - 分流抢票Zen Flowchart - 在线流程图MindMaster - 在线思维导图【抠图】在线抠图软件_AI抠图证件照换底色-稿定设计Visio模板推荐与VisualNet图库转化语音转文字iconfont-阿里巴…

LeetCode动态规划经典题目(九):middle

学习目标: 进一步了解并掌握动态规划 学习内容: 4. LeetCode62. 不同路径https://leetcode.cn/problems/unique-paths/ 5. LeetCode63. 不同路径 IIhttps://leetcode.cn/problems/unique-paths-ii/ 6. LeetCode343. 整数拆分https://leetcode.cn/pro…

人工智能学习06--pytorch06--神经网络骨架nn.Module scipy下载 现有网络模型的使用及修改(VGG16)

神经网络骨架nn.Module 括号里nn.Module表示继承Module类init 初始化 调用父类初始化函数forward scipy下载 pip install scipy -i https://pypi.douban.com/simple/ 现有网络模型的使用及修改(VGG16) pretrained为True时需要下载,在ima…

1. Spring 基础入门

文章目录1. 初识 spring1.1 系统架构1.2 学习路线1.3 核心概念2. IoC 与 DI 入门案例(xml版)2.1 IoC(控制反转)2.2 DI(依赖注入)3. bean 配置3.1 bean 基础配置3.2 bean 别名配置3.3 bean 作用范围配置4. b…

file控件与input标签的属性type=“hidden“标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>file控件于与input标签的属性type"hidden"标签</title> </head> <body bgcolor"antiquewhite"> …

k8s中使用Deployment控制器实现升级、回滚、弹性伸缩

前置条件&#xff1a;linux机器已安装k8s集群基于yaml文件创建pod,本次创建pod使用的web.yaml如下apiVersion: apps/v1 kind: Deployment metadata:creationTimestamp: nulllabels:app: webname: web spec:replicas: 2selector:matchLabels:app: webstrategy: {}template:metad…

从零开始的数模(八)TOPSIS模型

一、概念 1.1评价方法概述 1.2概念 TOPSIS &#xff08;Technique for Order Preference by Similarity to an Ideal Solution &#xff09;模型中文叫做“逼近理想解排序方法”&#xff0c;是根据评价对象与理想化目标的接近程度进行排序的方法&#xff0c;是一种距离综合评…

SAP入门技术分享六:搜索帮助

搜索帮助1.概要&#xff08;1&#xff09;利用ABAP数据字典的搜索帮助&#xff08;2&#xff09;利用画面的搜索帮助&#xff08;3&#xff09;Dialog程序中的搜索帮助&#xff08;4&#xff09;报表选择屏幕PARAMETERS的搜索帮助&#xff08;5&#xff09;搜索帮助类型2.创建搜…

plot4gmns:面向通用建模网络范式(GMNS)的快速可视化【v0.1.1】

一款面向通用建模网络范式&#xff08;GMNS&#xff09;的快速可视化工具 目录1. 标准数据框架2. 标准数据框架下的生态2.1 数据解析2.2 数据处理2.3 数据可视化3. 标准数据框架下的可视化3.1 基础语法3.2 进阶语法1. 标准数据框架 制定一套标准的数据框架&#xff0c;可实现不…

python图像处理(中值滤波)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 中值滤波和均值滤波的区别,有点像中位数收入和平均收入的区别。比如有三个人,年收入分别是10万、1万和1千,那么他们的平均收入就是(10+1+0.1)/3,平均数是3.3万左右,但是中位数…

《真象还原》读书笔记——第二章 编写 MBR 主引导记录

2.1 计算机的启动过程 开机后运行的第一个程序是 BIOS 。 BIOS 搬运 MBR 并 跳转运行 MBR… 2.2 软件接力第一棒 BIOS 全名 基本输入输出系统。 2.2.1 实模式下的 1MB 内存分布 2.2.2 BIOS 是如何苏醒的 BIOS本身不需要修改&#xff0c;于是被写入了ROM中&#xff0c;被映…

更换新电脑,如何将旧电脑数据/文件传输到新电脑?

最好的数据迁移工具提供了一种简单的解决方案&#xff0c;可将您的数据从一台 PC 传输到另一台 PC。 如果您以前没有做过&#xff0c;那么数据迁移的整个过程可能看起来很吓人。无论您是企业用户还是家庭用户&#xff0c;尝试将所有文​​件和文件夹从一台计算机迁移到另一台计…

CCPC2022(桂林)

题目链接&#xff1a;https://codeforces.com/gym/104008 G Group Homework 题目大意&#xff1a;在树上选出两条链&#xff0c;使得在两条链选中的点中&#xff0c;只被一条链选中的点的点权和最大。 题解&#xff1a;显然两条链要么不相交&#xff0c;要么只相交于一个点。…

WhiteHole Base beta版本正式发布!

体验 当前版本为基础测试版本&#xff0c;测试效果可以前往演示视频查看&#xff1a;https://www.bilibili.com/video/BV18Y411D7sA/?spm_id_from333.999.0.0&vd_source641e71dfd1a118fb834c4a5d156688d5 在线体验地址为&#xff1a; http://47.100.239.95 数据将保存~ …

BGP基础实验

1.先配置好IP和环回 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [R1-GigabitEthernet0/0/0]int l 0 [R1-LoopBack0]ip add 1.1.1.1 24 其他同理 2.在R2&#xff0c;R3&#xff0c;R4上配置OSPF ospf 1 area 0.0.0.0 network 3.3.3.3…

线段树(原理,模板)

文章目录线段树线段树代码(单点修改、区间查询)懒惰标记与区间修改树状数组与区间修改线段树 线段树是用来维护 区间信息 的数据结构 它可以在 O(log⁡n)O(\log n)O(logn) 的时间复杂度内实现单点修改、区间修改、区间查询&#xff08;区间求和&#xff0c;求区间最大值&…

Reasoning Through Memorization: Nearest Neighbor Knowledge Graph Embeddings论文阅读

研究问题 将基于记忆的方法与预训练语言模型相结合&#xff0c;以完成知识图谱补全任务 背景动机 传统模型无法处理未见实体记忆增强神经网络的相关进展&#xff0c;即在传统的计算模块之外添加单独的记忆存储模块 模型方法 首先使用预训练语言模型构建实体的知识库&#…