C语言中auto,register,static,const,volatile的区别详细解析

C语言中auto,register,static,const,volatile的区别 C语言中auto,register,static,const,volatile的区别 最容易混淆的几个关键字! 立即下载

作者: 字体:[增加 减小] 类型:转载 时间:2013-09-17 我要评论

以下是对C语言中auto,register,static,const,volatile的区别进行了详细的分析介绍,需要的朋友可以过来参考下

1)auto
这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

(2)register
这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

(3)static
常见的两种用途:
1>统计函数被调用的次数;

2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.

详细说明:
1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与栈变量和堆变量的区别。

2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

使用注意:
1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

(4)const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。

作用:
1>修饰输入参数
a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。

b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。

2>用const修饰函数的返回值
a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如对于: const char * GetString(void);

如下语句将出现编译错误:
char *str = GetString();//cannot convert from 'const char *' to 'char *';

正确的用法是:
const char *str = GetString();

b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数int GetInt(void) 写成const int GetInt(void)。
3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.

说明:
const type m; //修饰m为不可改变
示例:
typedef char * pStr; //新的类型pStr;
char string[4] = "abc";
const char *p1 = string;
p1++; //正确,上边修饰的是*p1,p1可变
const pStr p2 = string;
p2++; //错误,上边修饰的是p2,p2不可变,*p2可变

同理,const修饰指针时用此原则判断就不会混淆了。
const int *value; //*value不可变,value可变
int* const value; //value不可变,*value可变
const (int *) value; //(int *)是一种type,value不可变,*value可变
//逻辑上这样理解,编译不能通过,需要tydef int* NewType;
const int* const value;//*value,value都不可变

(5)volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。

简单示例:

复制代码代码如下:

 DWORD __stdcall threadFunc(LPVOID signal)
 {
 int* intSignal="reinterdivt"_cast(signal);
 *intSignal=2;
 while(*intSignal!=1)
 sleep(1000);
 return 0;
 }

该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
复制代码代码如下:

 mov ax,signal
 label:
 if(ax!=1)
 goto label

对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
复制代码代码如下:

 label:
 mov ax,signal
 if(ax!=1)
 goto label 

注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

(6)extern
extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

CMN-700组件全解析:从XP路由器到HN-F主节点的实战配置指南 本文深入解析Arm CMN-700片上网络IP的核心组件与实战配置。重点剖析了XP网格路由器的拓扑规划与CHI通道管理,以及HN-F全一致性主节点在维护缓存一致性、管理SLC和地址映射中的关键作用。通过一个12×12网格的配置案例,为硬件工程师提供了从组件布局、地址映射到性能调优的系统级设计指南。 阅读详情

相关推荐

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

static、volatile与const用法及区别

1、什么是static? static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其他源文件也可以访问。如果加了static,就会对其它源文件隐藏。对于变量而言,static还有其他作用:1)保持变量内容的持久性;2)默认值为0; 1.1、static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式,

houxiaoni01的博客 2555

深入解析Zynq Ultrascale+ RF Data Converter中的PLL配置与时钟管理

本文深入解析了Zynq Ultrascale+ RF Data Converter中PLL配置与时钟管理的核心原理与实践。文章将RFDC时钟系统比作交响乐团,详细阐述了PLL作为指挥的关键作用,以及系统时钟、Tile时钟、参考时钟与采样时钟的层级关系。重点剖析了PLL配置参数(如VCO频率、分频器设置)的计算方法与稳定性考量,并提供了从IP配置使能顺序到多Tile同步、DRP访问等常见问题的实战避坑指南与调试技巧,帮助工程师构建稳定的射频信号处理基石。

7up55的博客 449

C语言之volatile、static、const、extern

C语言之volatile、static、const、extern 1.volatile 1.1 volatile基本含义 volatile是一个类型修饰符(type specifier),是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接到内存中读值。 volatile防止代码被编译器优化,例如: a=1; a=2; a=3; 编译器会进行优化,优化为只有a=3(即忽略前三条语句,只产生一条机器代码);如果键入volat

m0_49416708的博客 1535

警惕AI依赖:如何避免数字水蛭侵蚀你的认知能力

在人工智能技术日益普及的今天,人机协作已成为现代工作流的核心范式。其原理在于通过算法模型辅助人类完成信息处理、内容生成等任务,从而提升效率。然而,过度依赖AI可能导致认知卸载,引发思考能力退化等潜在风险。从技术价值看,AI的核心在于增强而非替代人类智能,关键在于建立健康的协作模式。在应用场景上,无论是编程开发、内容创作还是决策分析,用户都需警惕工具依赖对深度工作、创造性思维和决策责任的侵蚀。本文聚焦于识别AI依赖的早期信号,并提供构建分阶段使用流程、将AI作为质疑者等具体策略,旨在帮助读者守护核心认知能力,

weixin_30240349的博客 625

SpeedyBee F405 V3 50A飞塔装机全攻略:从开箱到首飞避坑指南

本文提供SpeedyBee F405 V3 50A飞塔的详细装机指南,涵盖从开箱检查、硬件焊接、软件配置到安全首飞的全流程。重点剖析了电源连接、固件刷写等高频故障点,帮助FPV新手避开常见陷阱,确保一次成功组装并安全起飞。

weixin_29179311的博客 416

c语言 函数参数 auto,C语言中的auto,register,volatile,extern,static,const

你能很随意地说出C语言中 auto,register,volatile,extern,static,const这几个关键字的含义和用法么?auto这个关键字用于声明变量的生存期为自动。C程序是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。auto 变量是用堆栈(stack)方式占用储存器空间,因此,当执行...

weixin_35935249的博客 471

Winform从入门到精通(1)——Label(史上最全)

本篇文章是对专栏《winform控件从入门到精通》的详细介绍

qq_34059233的博客 4万+

C中的auto、static、register、extern、const和volitate

register变量:一般变量的值都是存储在内存中,(当程序需要用到哪一个变量的值,由控制器发出指令将内存中该变量的值送到运算器,完了如果需要存数,再从运算器将数据送到内存中存放。具体包括四种:自动的(auto),静态的(static),寄存器的(register)和外部的(extern)。static声明变量:用static声明的静态局部变量,在函数调用结束后不消失,反而保留当前的数据,在下一次该函数调用时,该变量现有的值就是上一次函数调用结束时的值。作用域为从变量的定义处开始,到本程序文件的结尾。

m0_70888041的博客 1437

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2840

自定义View系列教程04--Draw源码分析及其实践

通过之前的详细分析,我们知道:在measure中测量了View的大小,在layout阶段确定了View的位置。 完成这两步之后就进入到了我们相对熟悉的draw阶段,在该阶段真正地开始对视图进行绘制。按照之前的惯例,我们来瞅瞅View中draw( )的源码 public void draw(Canvas canvas) { final int privateFlags = mPriv

谷哥的小弟 2万+

auto的作用c语言,auto指的是什么意思

auto指的是什么意思发布时间:2020-12-07 11:08:25来源:亿速云阅读:180作者:小新这篇文章给大家分享的是有关auto指的是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。一:auto是什么意思auto是c语言中的一种储存类型,并且是在语句内部使用,auto最大的特点就是当执行流程进入语句块的时候,初始化可以是任何表达式。二:在c语言和C++的...

weixin_31456563的博客 9536

一文搞定 ST22 短转储 MEMORY_NO_MORE_PAGING:看懂 SAP Paging 机制,参数 rdisp/PG_SHM 与 rdisp/PG_MAXFS 怎么设才稳

SAP系统MEMORY_NO_MORE_PAGING错误通常源于Paging资源耗尽而非物理内存不足。关键排查点包括:通过ST22确认错误类型,ST02监控Paging使用情况,检查工作进程trace中的"no more free blocks"提示。解决方案建议将rdisp/PG_SHM和rdisp/PG_MAXFS设为相同值(如250000块≈2GB),使Paging完全在内存中运行。同时需优化易耗Paging的代码逻辑,如避免滥用EXTRACT命令和超大内存对象传输。典型案例如月末

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 334

extern、static、auto、register 定义变量的不同用法

首先得说明什么叫“编译单元”。每个 .c 文件会被编译为一个 .o 文件,这个就是一个编译单元。最后所有的编译单元被链接起来,就是一个库或一个程序。  一个变量/函数,只要是在全局声明的,链接之后都隐含地在所有编译单元中可见。但你的声明可能仅出现在一个 .c 文件中,这就暗示你不想把这个名字暴露给其它编译单元,这种情况下就得用 static 关键字,表示这个名字具有“内部链接”,只对当前编译

青春兵荒马乱的专栏 1049

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c语言关键字分析,auto、register、static、const、extern、volatile、struct、union、enum、typedef

1、关于auto、register:auto只能修饰局部变量,在栈上申请,所以一般不写。register 也只能修饰局部变量,申请寄存器,效率高,但会占用CPU的寄存器,一般用于需要高效率的实时程序。2、关于static:①. static全局变量与普通的全局变量有什么区别 ?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储方式, 静态全局...

weixin_42164528的博客 874

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

auto、static、register、const、volatile 、extern

转自:http://blog.sina.com.cn/s/blog_4b9216f50100ean1.html auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 register 这个关键字命令编译器尽可能的将

shellching的专栏 934

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

auto、static、register、const、volatile 、extern 总结

auto   这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。 register   这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。 static   常见的两种用途:      1>统计函数

821

阐述C语言

阐述C语言 C语言关键字详解阐述C语言欢迎使用C语言编写程序32个关键字typedef和#define的区别关键字解释注释也是必不可少的 欢迎使用C语言编写程序 在这里先普及一下,在我们C语言中一共有32个关键字,可能有几个在我们学习的过程中不太常用,但是大多数都是我们常用的,下来我们先来罗列一下着32个关键字都有什么,再来一一说一下他们的用法: 说关键字之前,先声明两个概念,在后面的文章中会用到...

171207的博客 275

C语言关键字(三)

之前的两篇文章 嵌入式Linux:c语言深度解剖(数据类型关键字)​zhuanlan.zhihu.com 嵌入式Linux:c语言深度解剖(入门篇)​zhuanlan.zhihu.com 这篇文件继续讲解C语言关键字 想问大家一个问题,什么是声明什么是定义? 举个例子: A)int i; B)extern int i;(关于 extern,后面解释) 哪个是定义?哪个是声明?或者都...

嵌入式Linux 2608

各个C语言关键字的案例,C语言关键字(三)

这篇文件继续讲解C语言关键字想问大家一个问题,什么是声明什么是定义?举个例子:A)int i;B)extern int i;(关于extern,后面解释)哪个是定义?哪个是声明?或者都是定义或者都是声明?什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来,它们就同生共死,终生不...

weixin_32932149的博客 223

C语言基础回顾-定义声明+关键字

一、关于定义和声明声明: 例: extern int i; extern int arr[ ];告诉编译器,已经定义了一个变量名,但是不分配空间,声明可以出现多次。定义: 例: int i const int i = 0(定义的同时初始化)创建一个对象或者变量并且给其分配内存,名字和内存匹配,并且内存的位置也不能改变,定义只能出现一次定义是一种特殊的声明。二、重要关键字:1.a

Jaxper. 665

1117c语言学习补遗

标准输入输出函数 printf 格式 printf(“格式符”,输出列表); 2)格式符 %d %c %u %o %s %e etc 3)修饰符(加在%和格式符关键字之间) m表示输出数字宽度 .n 表示实数的小数位数或字符串指定输出位数 — 左对齐 +显示正号 etc scanf 1)格式 scanf(“格式符”,注入地址列表); 2)消除输入垃圾可以在之后添加 getchar函数; 3)格...

xyc895的博客 271

随记(2)

       一、static:变量空间独立与函数中的auto变量或者栈变量,static变量空间在内存中的静态区内分配。 1.修饰局部变量:      一般情况下,局部变量是存放在栈区的,并且局部变量的生命周期在该语句执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束为止。      注意:其作用域没有改变,仍然是

lht1314tttt的博客 291

C 基础(11) - 存储类别、链接和内存管理

C语言存储类别与类型限定符详解 存储类别决定了变量的作用域、生命周期和存储位置,包括auto(局部变量默认)、register(建议存寄存器)、static(保持值不变)和extern(跨文件共享)四种。动态内存管理通过malloc()分配堆内存,free()释放,需注意内存泄漏和悬空指针问题。 类型限定符修饰变量特性:const定义常量,volatile防止优化(用于硬件/多线程),restrict优化指针访问(C99),_Atomic保证原子操作(C11)。这些机制共同增强了C语言对内存和变量的精细控制

qq_49477505的博客 381

整理数据类型方面的一些问题。

苏嵌                                                                                                                              项目实战 学习日志                                     姓名:                    ...

sunhot223的博客 222
上一篇: C++ 异常处理 catch(...)介绍
下一篇: 实现fopen支持中文的方法
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值