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. 基于深度学习的车辆检测系统(MATLAB代码,含GUI界面)

    摘要:当前深度学习在目标检测领域的影响日益显著,本文主要基于深度学习的目标检测算法实现车辆检测,为大家介绍如何利用\(\color{#4285f4}{M}\color{#ea4335}{A}\colo ...

  2. STM32 DMA(UART)

    转载自https://blog.csdn.net/as480133937/article/details/104827639/

  3. 【ACM程序设计】求最小生成树 Kuskual算法

    Kuskual算法 流程 1 将图G看做一个森林,每个顶点为一棵独立的树 2 将所有的边加入集合S,即一开始S = E( 并查集) 3 从S中拿出一条最短的边(u,v),如果(u,v)不在同一棵树内, ...

  4. 安装与基本配置DHCP服务器

    一,安装DHCP服务器角色 1,打开[开始]→[管理工具]→[服务器管理器]→"仪表板"选项的[添加角色和功能],持续单机[下一步]按钮, 直至出现下图所示的"选择服务器 ...

  5. 团队Arpha4

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  6. ts中 any、unknown、never 、void的区别

    any.unknown.never .void的区别 any 表示任意类型,设置为any相当于对该变量关闭了TS的类型检测.不建议使用 let a;(隐式any) //声明变量不赋值,就是any 等效 ...

  7. 个人&博客信息

                博客配置 服务器:无 配置链接:在博客园中安装皮肤 皮肤:GEEK by GUANGZAN           个人简介 本蒟蒻是广东中山人 如果您有一些问题,请发送邮件至mo ...

  8. Nacos源码系列—服务端那些事儿

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 在上节课中,我们讲解了客户端注册服 ...

  9. Java编程小技巧(1)——方法传回两个对象

    原文地址:Java编程小技巧(1)--方法传回两个对象 | Stars-One的杂货小窝 题目是个伪命题,由Java语法我们都知道,方法要么返回一个对象,要么就不返回 当有这样的情况,我们需要返回两个 ...

  10. Flutter异步与线程详解

    一:前言 - 关于多线程与异步 关于 Dart,我相信大家都知道Dart是一门单线程语言,这里说的单线程并不是说Dart没有或着不能使用多线程,而是Dart的所有API默认情况下都是单线程的.但大家也 ...