当前位置: 首页 > 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.dtcms.com/a/268983.html

相关文章:

  • 沉浸式视频的未来:MV-HEVC与3D-HEVC技术深度解析
  • 图像处理基础:镜像、缩放与矫正
  • 语音交互新纪元:Hugging Face LeRobot如何让机器人真正“懂你”
  • C++基础问题
  • GTA(传承/增强)1.71-3570环境补丁
  • 前端工程化设计详解
  • 摄影后期:使用Photoshop进行暗角控制
  • JavaSE -- 集合详细介绍(中篇)
  • 回溯题解——电话号码的字母组合【LeetCode】
  • C++ 虚函数(多态,多重继承,菱形继承)
  • Windows 7 环境下发布Python程序的 _socket 模块加载错误
  • jdk11安装详细教程window版和linux版
  • Node.js特训专栏-实战进阶:14.JWT令牌认证原理与实现
  • GitHub Actions自动化部署Vue项目到宝塔服务器
  • vue3+node.js+mysql写接口(一)
  • 【PTA数据结构 | C语言版】两枚硬币
  • SpringAI学习笔记-Chat简单示例
  • 无需科学网络,免费开源Pandawiki,无缝对接微信、飞书和钉钉!
  • Mac中Minicom串口调试基础使用
  • Redis架构安全
  • 基于Java+SpringBoot 的销售项目流程化管理系统
  • 利用英译法案例演示RNN中的注意力机制(基于PyTorch)
  • 通达信 股道交易系统 幅图
  • 汽车功能安全概念阶段开发【功能安全需求及方案(FSRFSC)】3
  • 风电自动化发电中的通信桥梁:CAN主站转MODBUS TCP网关解析
  • 基于Spring Boot和PF4J的轻量级热插拔框架:为FaaS赋能动态插件化开发
  • 单片机STM32F103如何实现CAN总线?
  • 第一届OpenHarmonyCTF--Crypto--WriteUp
  • 基于 STM32 和 ESP8266 的银行排队叫号系统设计与实现(项目资料)(ID:1)
  • 各服务器厂商调整BIOS睿频教程