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. python基础练习题(题目 递归输出)

    day19 --------------------------------------------------------------- 实例027:递归输出 题目 利用递归函数调用方式,将所输入的 ...

  2. JVM垃圾回收篇

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 GC=jvm垃圾回收,垃圾回收机制是由垃圾回收器Garbage ...

  3. Atlassian应对CVE-2022-22963,CVE-2022-22965的常见问题

    CVE-2022-22965 常见问题解答 基本信息 已发现 Spring Framework 中的关键远程代码执行漏洞 CVE-2022-22965.根据 Spring 的安全公告,此漏洞会影响在 ...

  4. vant 使用field组件加载页面就触发input事件的坑,已解决

    使用vant的时候,遇到一个坑,加载组件就自动触发input事件,input事件里写了验证,导致已加载就验证错误 原因:v-model绑定的时候写的是null, filed组件接收的时候把他转换成空字 ...

  5. 【论文笔记】A review of applications in federated learning(综述)

    A review of applications in federated learning Authors Li Li, Yuxi Fan, Mike Tse, Kuo-Yi Lin Keyword ...

  6. Linux 常见必备

    一.学习Linux须知常识 1.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比 ...

  7. gitee上传代码到仓库步骤(最简洁图文+命令说明)

    gitee上传代码到仓库步骤(最简洁图文+命令说明) 目录 1.初始化项目 2.将当前目录下所有需要上传的文件代码等资源添加到缓存区 3. 提交缓存区里面的主要内容到本地仓库 4.添加一个远程仓库的地 ...

  8. python常用内置函数和关键字

    常用内置方法 在Python中有许许多多的内置方法,就是一些Python内置的函数,它们是我们日常中经常可以使用的到的一些基础的工具,可以方便我们的工作. 查看所有的内置类和内置方法 # 方法一 bu ...

  9. 什么是Docker容器?(全面了解使用)

    一:为什么需要Docker容器? 1.引入 1.1麻烦的环境部署 1.在软件开发中,最麻烦的事情之一就是环境配置.在正常情况下,如果要保证程序能运行,我们需要设置好操作系统,以及各种库和组件的安装. ...

  10. redis 2 主从和哨兵

    主从: 概念:将一台redis服务器数据复制到其他redis服务器,前者是master,后者是slave.数据复制是单向,从主节点复制到从节点.master以写为主,slave以读为主一个zhu主节点 ...