C语言中常用的一般包括const、static、extern、register和volatile这几个。这些是C语言标准中规定的关键词,所有的编译器都必须支持这些关键词,它们的作用如下:

1、const修饰的变量被称为常量,所谓常量,就是不能改变、不能再赋值的变量。

  比如int a = 10,定义了一个变量a,并初始化为a = 10,在后续的代码中我们可以随时修改a的值的,可以通过a = 15把a的值修改为15。

  但是如果使用const修饰了变量,比如const int a = 10或者int const a = 10,这时候a就是一个常量变量,它的值就固定为了初始化时的值10,后续代码如果出现了a = 15编译器就会报错告诉你a是一个常量,不能赋值。

  有一点需要注意的是cons修饰的对象,对于普通变量而言,const修饰的就是变量,但是对于指针而言,const在不同的位置修饰的对象就不同了。比如const int *p或者int const *p和int * const p修饰的就是两个不同的对象,前者const int *p修饰的是整个(*p),也         就是指针p所指向的内存中的值是常量,是不能改变的,这种称为常量指针。如果定义了const int *p = &a;int a = 10;这时候就不能再通过*p = 15来改变a的值了,但是因为a并不是const修斯的变量,我们还是可以通过给a赋值的方式修改*p的值,如果a = 15,那          么*p = 15。有一点需要注意的是,p的值是可以修改的,因为const修饰的是*p并不是p,所以我们可以通过int b = 15,p = &b的方式修改*p的值。

  这就引出了另一种修饰方式int * const p,这种称为指针常量,这时候const修饰的就是指针p,所以p的值就是不能改变的,如果有int * const p = &a,int a = 10,把么p就永远指向a所在的地址了,p = &b就是错误的。这时可以通过*p = 15和a = 15的方式修改*p的         值。

  总结下来就是常量指针 const int *p表示*p的值不能修改,但是p的值可以修改。指针常量int  * const p表示p的值是不能改变的,但是*p的值可以改变。

  使用const的本意是希望被const修饰的值不被代码其他行为修改,但是当const修饰指针的时候,如果不注意逻辑关系,往往会造成const修饰的值被意外修改:

  (1)、int a = 10;const int *p = &a,如果出现了a = 15,那么*p = 15

  (2)、const int a = 10,int b = 15,const int *p = &a,如果出现了p = &b(或者p = p1,p1为指针,*p1 = 15),那么a = 10,*p = 15

2、static可以修饰变量和函数,static修饰变量的时候分两种情况

  (1)、static修饰局部变量,自动初始化变量并延长变量的生存周期(跳出函数之后变量的值不会被释放修改),static int a;表示a是一个静态变量,并初始化为a = 0;普通的局部变量定义的时候不会初始化,它的值虽然大部分时候为0,但实际情况它可能是任                     意值(分配的地址中的值)。

  (2)、static修饰全局变量和函数,主要是限定全局变量和函数的作用域,被static修饰的全局变量和函数只能在当前源文件调用,其他源文件无法调用。

3、extern可以修饰变量和函数,它的作用申明变量和函数,告诉编译器这个变量和函数是在其他文件中定义的,要调用这个变量或者函数的时候就去其他文件查找。有一点需要注意的是,如果变量或者函数在其他文件中被static修饰了,extern就没法申明变量和函数。

4、register只能修饰局部变量,表示让编译器把这个局部变量放在寄存器当中,不要放在堆栈里,因为调用变量的时候MCU都是先把变量从堆栈中读到寄存器中再进行操作,这样直接放在寄存器中就可以节省时间。有一点需要注意,register只能修饰局部变量,因为  

  寄存器的数量是有限的,当寄存器用完了之后编译器还是会自动把变量放在堆栈区。

5、volatile可以修饰各种变量,它表示当前变量是随时可能改变的,告诉编译器调用这个变量的时候每次都去变量所在的地址读值而不是从寄存器中取值。

 

C语言中限定符的作用的更多相关文章

  1. const限定符的作用

    const限定符的作用:                                     1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...

  2. C语言restrict限定符

    restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其 ...

  3. C语言中续行符“\”说明

    把一个预处理指示写成多行要用“\”续行,因为根据定义,一条预处理指示只能由一个逻辑代码行组成. 而把C代码写成多行则不必使用续行符,因为换行在C代码中只不过是一种空白字符,在做语法解析时所有空白字符都 ...

  4. Python中@修饰符的作用。

    '@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.也就是说@A def f(): 是非法的. 只可以在模块或类定义层内对函数进行修饰, ...

  5. scanf函数中*修饰符的作用,如:%*d

    在scanf函数中,*修饰符可以跳过所在项的输入.如下: #include <stdio.h> int main() { ; printf("请输入:"); scanf ...

  6. printf函数中*修饰符的作用,如:%*d

    在printf函数中,我们可以用数字修饰来控制打印的字段宽度和精度,如下(为强调视觉效果,均填充0): #include <stdio.h> int main() { ; float f= ...

  7. C语言中两个!!的作用

    两个!是为了把非0值转换成1,而0值还是0. 因为C语言中,所有非0值都表示真. 所以!非0值 = 0,而!0 = 1.所以!!非0值 = 1,而!!0 = 0.例如:i=123 !i=0 !!i=1 ...

  8. OpenGL ES 2.0 限定符

    限定符 说明 作用 attribute 一般用于各个顶点各不相同的量,如顶点位置.颜色等 属性限定符,修饰的变量用来接收渲染管线传递进顶点着色器的当前顶点的各种属性值. 只能用来修饰符点数标量,浮点数 ...

  9. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

      c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...

随机推荐

  1. javascript中的宏任务和微任务(二)

    js事件轮询执行顺序总结: 1)所有的同步任务都在主线程上执行,行成一个执行栈. 2)除了主线程之外,还存在一个任务列队,只要异步任务有了运行结果,就在任务列队中植入一个时间标记. 3)主线程完成所有 ...

  2. Linux中信号量的实现

    如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量.本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务. 信号量定义如下: struct semap ...

  3. Asp.Net在线预览Word文档的解决方案与思路

    前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...

  4. 攻防世界-MISC:Erik-Baleog-and-Olaf

    这是攻防世界MISC高手进阶区的题目,题目如下 点击下载附件一,解压后得到一个文件,不知道是什么格式,用010editor打开,发现其为png文件,就把它的后缀改为png,然后用stegslove打开 ...

  5. Linux-交互式转化批处理工具expect

    expect 是由Don Libes基于 Tcl( Tool Command Language )语言开发的,主要应用于自动化交互式 操作的场景,借助 expect 处理交互的命令,可以将交互过程如: ...

  6. 详解计算miou的代码以及混淆矩阵的意义

    详解计算miou的代码以及混淆矩阵的意义 miou的定义 ''' Mean Intersection over Union(MIoU,均交并比):为语义分割的标准度量.其计算两个集合的交集和并集之比. ...

  7. 一篇文章说清 webpack、vite、vue-cli、create-vue 的区别

    webpack.vite.vue-cli.create-vue 这些都是什么?看着有点晕,不要怕,我们一起来分辨一下. 先看这个表格: 脚手架 vue-cli create-vue 构建项目 vite ...

  8. 【面试普通人VS高手】Spring 中Bean的作用域有哪些?

    一个工作3年的小伙子,去面试被问到Spring里面的问题. 这个问题比较简单,但是他却没有回答上来. 虽然他可以通过搜索引擎找到答案,但是如果没有理解,下次面试还是不会! 这个面试题是: " ...

  9. uniapp复制到剪贴板

    uni.setClipboardData() ; 例: 给元素添加点击事件 <view @click="doCopy()">复制</view> 复制方法 d ...

  10. 139_Power BI之某制造企业HR相关数据年度复盘

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近在忙一个关于制造企业HR年度数据复盘分析:数据已脱敏. 先来看看效果. 1.视频效果 [video widt ...