返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言详细分析讲解关键字const与volatile的用法
  • 887
分享到

C语言详细分析讲解关键字const与volatile的用法

2024-04-02 19:04:59 887人浏览 独家记忆
摘要

目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con

一、const 只读变量

  • const 修饰的变量是只读的,本质还是变量
  • const 修饰的局部变量在栈上分配空间
  • const 修饰的全局变量在全局数据区分配空间
  • const 只在编译期有用,在运行期无用

const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。

二、const 全局变量的分歧

在现代C语言编译器中,修改 const 全局变量将导致程序崩溃。

注意:标准C语言编译器不会将 cons t修饰的全局变量存储于只读存储区中,而是存储于可修改的全局数据区,其值依然可以改变。

下面看一段代码:

#include <stdio.h>
 
const int g_cc = 2;
 
int main()
{
    const int cc = 1;
    
    int* p = (int*)&cc;
    
    printf("cc = %d\n", cc);
    
    *p = 3;
    
    printf("cc = %d\n", cc);
    
    p = (int*)&g_cc;
    
    printf("g_cc = %d\n", g_cc);
    
    *p = 4;
    
    printf("g_cc = %d\n", g_cc);
    
    return 0;
}

下面为输出结果:

上面代码说明 const 修饰的局部变量可以通过指针修改里面的值,但是 const 修饰的全局变量则不能通过指针来修改里面的值,会发生段错误。

三、const 的本质

  • C 语言中的 const 使得变量具有只读属性
  • 现代 C 编译器中的 const 将具有全局生命周期的变量存储于只读存储区(staic 修饰的变量也有全局生命周期,所以用 const 修饰后也存储于只读存储区)
  • const 不能定义真正意义上的常量

下面看一段 const 本质分析的代码:

#include <stdio.h>
 
const int g_array[5] = {0};
 
void modify(int* p, int v)
{
    *p = v;
}
 
int main()
{
    int const i = 0;
    const static int j = 0;
    int const array[5] = {0};
    
    modify((int*)&i, 1);           // ok
    //modify((int*)&j, 2);           // error
    modify((int*)&array[0], 3);    // ok
    //modify((int*)&g_array[0], 4);  // error
    
    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("array[0] = %d\n", array[0]);
    printf("g_array[0] = %d\n", g_array[0]);
    
    return 0;
}

下面为输出结果:

如果把注释去掉,就会报段错误:

这就对应上面说的,如果修改 const 修饰的全局生命周期的变量,程序就会发生崩溃。

四、const 修饰函数参数和返回值

  • const 修饰函数参数表示在函数体内不希望改变参数的值
  • const 修饰函数返回值表示返回值不可改变,多用于返回指针的情形

小贴士:C 语言中的字符串字面量存储于只读存储区中,在程序中需要使用 const char* 指针。

下面看一段const 修饰函数参数与返回值的代码吧:

#include <stdio.h>
 
const char* f(const int i)
{
    //i = 5;
    
    return "Autumn Ze";
}
 
int main()
{
    const char* pc = f(0);
    
    printf("%s\n", pc);
    
    //pc[6] = '_';
    
    //printf("%s\n", pc);
    
    return 0;
}

下面为输出结果:

如果把下面的语句去掉注释

    //pc[6] = '_';
    
    //printf("%s\n", pc);

运行程序就会报错,不能尝试去修改只读变量:

五、volatile 解析

  • volatile 可理解为“编译器警告指示字”
  • volatile 告诉编译器必须每次去内存中取变量值
  • volatile 主要修饰可能被多个线程访问的变量
  • volatile 也可以修饰可能被未知因数更改的变量

如下:

六、小结

  • const 使得变量具有只读属性
  • const 不能定义真正意义上的常量
  • const 将具有全局生命期的变量存储于只读存储区
  • volatile 强制编译器减少优化,必须每次从内存中取值

到此这篇关于C语言详细分析讲解关键字const与volatile的用法的文章就介绍到这了,更多相关C语言 const与volatile内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言详细分析讲解关键字const与volatile的用法

本文链接: https://lsjlt.com/news/146592.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2024-04-02
  • C语言关键字const与volatile怎么用
    今天小编给大家分享一下C语言关键字const与volatile怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、con...
    99+
    2023-06-30
  • C语言详细分析讲解关键字goto与void的作用
    目录一、关于goto二、void 的意义三、小结一、关于goto 高手潜规则:禁用 goto项目经验:程序质量与 goto 的出现次数成反比最后的判决:将 goto 打入冷宫 下面看...
    99+
    2024-04-02
  • C语言详细分析讲解关键字enum与sizeof及typedef的用法
    目录一、枚举类型的使用方法二、sizeof 关键字的用法三、typedef 的意义四、小结一、枚举类型的使用方法 enum 是 C 语言中的一种自定义类型enum 值是可以根据需要自...
    99+
    2024-04-02
  • C语言详细讲解const的用法
    目录一、int const a / const int a二、const int(*p)/int const(*p)三、int*const p四、const用于函数的地址传递参数一、...
    99+
    2024-04-02
  • C++ const关键字分析详解
    目录C语言中修饰变量C语言中修饰指针变量C语言中修饰函数的参数C++中修饰变量C++中修饰函数的参数C++中修饰函数的返回值C++中修饰类的成员函数C++中修饰类的成员变量总结C语言...
    99+
    2024-04-02
  • C语言中volatile关键字的详细介绍
    这篇文章主要讲解了“C语言中volatile关键字的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中volatile关键字的详细介绍”吧!1. 什么是volatile关键字?v...
    99+
    2023-06-20
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2024-04-02
  • C语言中auto,register,static,const,volatile的区别详细解析
    1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变...
    99+
    2022-11-15
    register static const volatile
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2024-04-02
  • C语言volatile关键字的作用与示例
    目录写在前面volatile和内联汇编的volatile的选择写在前面 版本信息:Linux操作系统,x86架构,Linux操作系统下GCC9.3.1版本。GCC 9.3.0手册。 ...
    99+
    2023-05-15
    C语言volatile关键字 C语言volatile
  • C++关于const与引用的分析讲解
    目录一、关于 const 的疑问二、关于引用的疑问三、小结一、关于 const 的疑问 const 什么时候为只读变量?什么时候是常量? const 常量的判别准则 只有用字面量初始...
    99+
    2024-04-02
  • Java超详细分析讲解final关键字的用法
    目录基本介绍final细节01final细节02基本介绍 final 可以修饰类、属性、方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用到final: Base Sub...
    99+
    2024-04-02
  • c语言中const关键字的作用
    const关键字在c语言中用于修饰变量或函数,使其值或行为在程序执行期间保持不变。它可以修饰变量(使其成为常量),防止意外修改数据,提高程序安全性。此外,const还可以修饰函数,确保其...
    99+
    2024-05-10
    c语言 敏感数据 代码可读性
  • 如何分析C语言关键字中的void、const和return
    这篇文章将为大家详细讲解有关如何分析C语言关键字中的void、const和return,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。return首先我们弄清楚c语言内存分配的方式然后我们看一...
    99+
    2023-06-22
  • C++ 右值引用与 const 关键字详解
    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符。修饰符本身,并不产生任何实际代码。就 const 修饰符而言,它用来告...
    99+
    2024-04-02
  • 详解C++ 左值引用与 const 关键字
    左值引用是已定义的变量的别名,其主要用途是用作函数的形参,将 const 关键字用于左值引用时,其在初始化时可接受的赋值形式变得更加广泛了,这里来总结一下。 左值引用是已定义的变量的...
    99+
    2024-04-02
  • C语言详细分析讲解struct与union使用方法
    目录一、struct 的小秘密二、结构体与柔性数组三、C语言中的 union四、小结一、struct 的小秘密 C语言中的 struct 可以看作变量的集合 struct ...
    99+
    2024-04-02
  • C语言中go是关键字吗?详细解析
    标题:C语言中go是关键字吗?详细解析 在C语言中,"go"并不是一个关键字。C语言的关键字是由C标准规定的,用于表示特定的语法结构或者功能,在编译器中有特殊的含义,不能被用作标识符或...
    99+
    2024-04-02
  • C语言中的Const关键字怎么用
    这篇“C语言中的Const关键字怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的Const关键字怎么用”文章吧...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作