当前位置: 首页 > news >正文

【C语言】const、volatile、restrict、static四大关键字学习笔记

1. const — 常量修饰符

作用

  • 修饰变量或指针指向内容为只读,防止修改。
  • 提高代码安全性和可读性。

用法示例

const int a = 10;              // 只读变量
void func(const char *str);    // 函数不会修改 str 指向的数据
const char* getMessage(void);  // 返回只读字符串指针

特点

  • 可以修饰变量、指针指向的数据、函数参数、返回值。
  • 不能修饰函数本身。

2. volatile — 易变修饰符

作用

  • 表示变量可能被外部异步修改(硬件、中断、其他线程等)。
  • 编译器禁止对其做优化,确保每次访问都从内存读取。

用法示例

volatile int flag;             // 可能被中断修改
void func(volatile int *p);    // 指针指向内容可能异步变动

特点

  • 修饰变量、指针指向的数据、函数参数。
  • 不能修饰函数本身。
  • 不提供同步,仅保证访问不被优化。

3. restrict — 指针限定符(C99)

作用

  • 表示指针是访问其所指向内存的唯一指针。
  • 允许编译器进行激进优化,提升性能。

用法示例

void copy(int * restrict dst, int * restrict src, int n);

特点

  • 只能修饰指针变量。
  • 程序员必须保证指针指向的内存不与其他指针重叠。
  • 错误使用可能导致未定义行为。

4. static — 存储类修饰符

作用

  • 修饰变量:局部变量静态存储,生命周期贯穿程序,作用域限于定义位置。
  • 修饰变量:全局变量限制文件内可见,防止外部访问。
  • 修饰函数:限制函数只在当前文件可见,实现模块封装。

用法示例

// 局部静态变量,保持状态
void counter() {static int count = 0;count++;printf("%d\n", count);
}// 文件内私有全局变量
static int module_var = 100;// 文件内私有函数
static void helper() {// ...
}

特点

  • 用于变量和函数。
  • 增强封装性,防止符号冲突。

5. 综合示例

// 文件内私有变量和函数
static int internal_counter = 0;static void incrementCounter(void) {internal_counter++;
}// 接口函数,参数为只读且唯一访问的指针,内容可能异步变动
void processData(const volatile int * restrict data, int size) {for (int i = 0; i < size; i++) {// 读取 data[i],但不修改int val = data[i];// 处理 val ...}
}

6. 总结对比

关键字修饰对象作用和意义是否可修饰函数本身
const变量、指针指向内容数据只读,防止修改,提高安全和可读性
volatile变量、指针指向内容防止优化,保证每次访问内存,适合异步变化的数据
restrict指针指针唯一访问所指内存,允许激进优化
static变量、函数变量延长生命周期或限制可见性,函数限制文件作用域
http://www.lryc.cn/news/582385.html

相关文章:

  • javaScirpt学习第八章-第一部分
  • RoboRefer:面向机器人视觉-语言模型推理的空间参考
  • 针对Exhcnage Server的攻击防范措施
  • Qt中的QProcess类
  • 内网渗透——红日靶场五
  • 【PyTorch】PyTorch中torch.nn模块的循环层
  • L0:让大模型成为通用智能体的强化学习新范式
  • Eslint基础使用
  • 从问题出发看Spring的对象创建与管理
  • 安装goland
  • 设计模式—专栏简介
  • Day08-Flask 或 Django 简介:构建 Web 应用程序
  • linux操作系统---MySQL Galera Cluster部署
  • 7.7晚自习作业
  • 【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
  • Kafka生产者的初始化
  • 【人工智能】ChatGPT、DeepSeek-R1、DeepSeek-V3 辨析
  • 20250707-4-Kubernetes 集群部署、配置和验证-kubeconfig_笔记
  • Maven依赖与JRebel热部署一站式解决方案
  • Java 命令行参数详解:系统属性、JVM 选项与应用配置
  • 【牛客算法】游游的整数切割
  • c语言中的函数VII
  • 回溯题解——子集【LeetCode】输入的视角(选或不选)
  • 机器学习知识
  • 独立开发A/B测试实用教程
  • Docker 稳定运行与存储优化全攻略(含可视化指南)
  • LeetCode 151. 反转字符串中的单词
  • TCP长连接保持在线状态
  • 人工智能-基础篇-23-智能体Agent到底是什么?怎么理解?(智能体=看+想+做)
  • 数据中台架构解析:湖仓一体的实战设计