c语言中auto、register、extern、static用法

C语言中关键字auto、static、register、extern、volatile、restrict的作用 auto (1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。 (2)auto修饰局部变量,表示这个局部变量时自动局部变量,自动局部变量分配在栈上。(既然是分配在栈上,说明他如果不初始化的话那么值就是随机的…) (3)平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。 static (1)static关键字在... 阅读详情

转载地址:http://www.111cn.net/net/c/38998.htm

四种存储类别说明符有两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期,具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。auto、register 两个是用来修饰变量的, extern、static两个都变量函数都可以。


一、 auto

   定义的变量默认是auto类型的

二、register变量

       关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中。有以下几点注意的地方。

        1、register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。

    但是,有些机器的寄存器也能存放浮点数。

       2、register变量可能不存放在内存中,所以不能用取址符运算符“ & ”。

       3、只有局部变量和形参可以作为register变量,全局变量不行。

       4、静态变量不能定义为register。 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,

/* Procedure for the assignment of structures, */

/* if the C compiler doesn't support this feature */

  #ifdef NOSTRUCTASSIGN

  memcpy (d, s, l)

{

register char *d;

  register char *s;

  register int i;

  while (i--)

  *d++ = *s++;

  }

#endif

 

三、static

      1、修饰变量(局部和全局变量)

             ①静态全局变量:

               在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);

      作用域仅限于变量被定义的文件中。

 

               全局变量和全局静态变量的区别:  

              1)全局变量是不显式用static修饰的全局变量,但全局变量 默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,

        通过extern 全局变量名的声明,就可以使用全局变量。

           2)全局静态变量是显式用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。

          ② 静态局部变量

 

#include<cstdio>增加这条语句 char a = ‘A‘; // global variable void msg()  {      printf("Hellon");  }

你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。 如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。 (2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。 (3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。 最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。 下面是main.c的内容 除了头文件,需要声明函数:void msg();

int main(void) {         extern char a;    // extern variable must be declared before use      printf("%c ", a);      (void)msg();     return 0; }

    2、静态函数

     在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,

   不能被其它文件使用。其它文件中可以定义相同名字的函数,不会发生冲突。

static 函数…..   内部函数和外部函数   当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。   1 内部函数(又称静态函数)   如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。   定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:   static 函数类型 函数名(函数参数表)   {……}   关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。   使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。   2 外部函数   外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:   [extern] 函数类型 函数名(函数参数表)   {……}   调用外部函数时,需要对其进行说明:   [extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];   案例]外部函数应用。   (1)文件mainf.c

  main()   { extern void input(…),process(…),output(…);   input(…); process(…); output(…);   }   (2)文件subf1.c   ……   extern void input(……) /*定义外部函数*/   {……}   (3)文件subf2.c   ……   extern void process(……) /*定义外部 函数*/   {……}   (4)文件subf3.c   ……   extern void output(……) /*定义外部函数*/   {……} 





CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程 本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。 阅读详情

相关推荐

直流有刷电机控制 - 认识电机(一)

电机控制学习

u011030644的博客 917

关键字(1)auto和register详解

文章目录关键字第一讲关键字分类程序的概念那么程序在没有运行的时候是在哪里呢?变量为什么要定义变量定义变量的本质是变量声明的本质是(通常声明全局变量)变量的赋值和初始化1.1关键字auto作用域(是一个空间的概念)生命周期(是一个时间点的概念)局部变量2.关键字register 关键字第一讲 关键字分类 C语言一共有多少个关键字呢?答案是32个,但是在c99中新增了五个。目前主流编译器对c99支持不是很好我们默认为32个。 auto 声明自动变量 short 声明短整型变量或函数 int 声明整型变量或

qq_62745420的博客 1415

人脸关键点定义汇总

前几天看一份代码临时需要找49个人脸关键点位置定义的图片发现怎么百度都搜不到,最后幸好谷歌可以使用了就用谷歌搜到了。所以在这里汇总一下我所知道的人脸关键点的定义和相关的一点东西,以备不时之需。 68个关键点 最常用的工具是Dlib,网址:http://dlib.net/ dlib的68个特征点检测算法是ERT算法【1】 使用dlib检测68个特征点的python示例见:http://dlib.n...

程序媛 7641

c语言局部变量的三种类型auto,static和register详解

c语言局部变量,寄存器变量,静态变量和自动类变量

qq_64426102的博客 5357

STLink驱动故障全解析:从卡顿到重装的终极修复指南

本文全面解析STLink驱动故障的常见现象及解决方案,包括驱动卸载、重装、Keil环境配置等关键步骤。针对设备管理器黄色感叹号、Keil识别异常等问题,提供从软件到硬件的终极修复指南,帮助开发者高效解决STLink连接问题。

sss66的博客 734

python ERA-5气象数据NetCDF格式解析(一)

python ERA-5气象数据NetCDF格式解析

weixin_43896283的博客 2637

六、C语言基础——深入理解C语言中的常量与变量:用法、区别及案例

在C语言中,常量和变量是编程中常用的数据类型。本文重点介绍了常量和变量的定义和使用方法,包括各种类型的常量和变量的声明和赋值方式。同时,文章还介绍了常量和变量在不同场景下的应用,如字符串常量、标识符常量和不同存储类型的变量。掌握了常量和变量的使用方法,对于C语言程序的编写和调试都是非常重要的基础知识。常量和变量在C语言中是基础且重要的概念,对于初学者来说,掌握常量和变量的定义和使用方法是编写C语言程序的第一步。希望本文对初学者理解C语言中的常量和变量有所帮助。

qq_57737603的博客 1832

uniapp - 详细实现移动端公众号 H5 网页授权登录流程及示例代码,申请测试公众号全流程及本地调试无需部署上线服务器就能直接调起微信登陆授权页面,手机移动端h5公众号页面利用微登录拿到用户数据!

uni-app,微信公众号,h5网页,uniapp网页端,手机端H5公众号页面,微信网页登陆,uniApp详细实现公众号的登录,微信授权第三方网站登录,流程及逻辑详细教程,OAuth2.0,公众号网页授权,微信网页授权通过code换取网页授权,redirect_url,参数错误,解决,报错,无法调起,如何申请测试公众号,微信公众平台测试号的申请与使用,获取用户openid手机号昵称头像,利用测试号实现本地调试微信登录授权,本地无法调试怎么办,测试公众号,在开发环境下怎么测试,用项目本地ip地址,微信公众号平

🏆 前端领域优质创作者 5061

auto、 register、 extern、 static关键字详解

1、auto auto是C++提供的存储类声明符,用于声明自动变量。 除了auto声明符外,C++还提供了另外3个存储类声明符,分别是register(寄存器存储)、extern(外部存储)和static(静态存储)。在声明创建变量时,存储类声明符应放在数据类型声明符之前: void demo(){ auto int A; } 2、register 除了auto外,还可以通过存储类声明符register来声明自动变量,与auto唯一的不同在于:关键字register通知编译器,用户希望通过CPU寄存器,

Smile@小女子的博客 3417

Microsemi Libero系列教程(全网首发)

关于Libero IDE和Libero SoC Libero分为Libero IDE和Libero SoC,Libero IDE最新版本是v9.2 SP3(2016年4月4日)已经不再更新维护了,而Libero SoC是Libero IDE的升级版,官方推荐的开发工具,文中的Libero指的是Libero SoC。 Libero SoC Libero® SoC是Microsemi(美高森美)官方...

whik1194的博客 2万+

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

理解和如何使用关键字auto、static、extern、register

C的存储类型包括4种即auto一、auto---自动变量函数中定义的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中,在调用函数时,系统会给这些变量分配存储空间,在函数调用结束时就会自动释放这些存储空间。这类局部变量称为自动变量。自动变量使用关键字auto作存储类别的声明。int test()//定义a为自动变量其中,a是自动变量,对a赋值为3,执行完test后,自动释放 a所占的存储单元。实际上,关键字auto可以省略,

HZ_ENG的博客 2176

基于STM32姿态解算-正点原子ATK-IMU901模块标准库开发——正点原子串口角度传感器模块十轴IMU加速度气压计陀螺仪_资料编号29

购买了正点原子的ATK-IMU901模块后,发现例程给的是HAL库的,本项目将HAL库例程转换为库函数版本(基于STM32)。实战开发,亲测无误。

嵌入式阿齐Archie 3861

C语言存储类型 auto,register,static,extern

C语言存储类型关键字有:auto,register,static,extern;这些说明符放置在它们所修饰的类型之前。auto用于定义局部变量或函数形参;register用于定义局部变量或函数形参,寄存器变量不能用 & 取地址。extern关键字用于声明该全局变量或函数在其他文件中有定义,extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候。用static声明的局部变量,改变了这个局部变量的生存期为静态生存期;用static关键字修饰的全局变量,改变了这个全局变量的作用域为文件作用域

天道酬勤 1552

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【c语言】关键字存储类型讲解(auto,extern,static,register,const)

渣渣C的学习之路 用最简单的话,让你最快速明白! C语言中,每一个变量和函数都有2个属性:数据类型和数据的存储类别。C的存储类别有4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。变量的存储类别对应变量的作用域与生命周期。 1.extern extern外部声明,简单来说:你如果要在a.c中使用b.c的一个变量avg,直接使用是会报错的...

Z小旋 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言中extern、register、statiC、auto的区别

变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种。 内存中。具体点来说内存分为三块:静态区,堆区,栈区。外部变量和全局变量存放在静态区,局部变量存放在栈区,动态开辟的内存存在堆区。 一、简要性比较 extern 外部变量声明,是指这是一个已在别的地方定义过的对象,这里只是对变量的...

JonahMoon的博客 1953

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

不一样的C语言-auto,register,static,extern

auto,register,static,extern 《不一样的C语言》开篇中,笔者写出了对变量的认识,本篇文章中,笔者继续来探究与变量相关的auto,register,static,extern修饰符,进一步加深对变量的理解。 auto、register修饰的是变量,static和extern既能修饰变量也能修饰函数,本文中对于函数部分一笔带过,待研究函数时再来详细谈论。 auto修

water_3700348的博客 511

C 语言中 auto/static/register/extern 的区别

C中的auto、static、register和extern的区别 C语言中的每一个变量和函数有两个属性:数据类型和数据的存储类别。数据类型(整形、字符型等),存储类别是指数据在内存中存储的方法,存储方法有两大类:静态存储类和动态存储类。具体包括四种:自动的(auto),静态的(static),寄存器的(register)和外部的(extern)。

Jeremy_Yuan的博客 1180

C语言变量存储类型auto,static,extern,static extern,register

C语言变量存储类型autostaticexternstatic externregisterauto 局部变量     auto 变量是用堆栈(stack)方式占用储存器空间,因此,当执行此区段是,系统会立即为这个变量分配存储器空间,而程序执行完后,这个堆栈立即被系统收回.在大括号{}内声明.    自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函

AnnanIn2008的专栏 1768

[C语言]关键字解析(一) auto, register, extern和static关键字

C语言一共多少个关键字呢?一般网上会说是32个,但是这个都是 C90(C89) 的标准。其实 C99 后又新增了5个关键字。不过,目前主流的编译器,对 C99 支持的并不好,我们后面默认情况使用 C90 ,即认为32个.这篇文章中我们不会讲解int,char,if,while等十分简单常见的关键字,而是讲解一些其他略微复杂的关键字。

kklovecode的博客 534

C语言变量存储类型auto,static,extern,static extern,register .

2012年4月微软MVP申请开始!                  点击了解英特尔云计算            2012年1月当选微软MVP的优快云会员名单揭晓! C语言变量存储类型auto,static,extern,static extern,register 分类: C/C++ 2011-09-16 17:51 43人阅读 评论(0) 收藏

梦想起航的地方 993

C语言 auto,static,extern,register类型的区别

auto自动变量: 一般情况下,C语言默认所定义的变量都是自动变量。 int a;编译器会自动解析为:auto int a; 不仅仅变量,还包括数组,结构体,指针,共用体。 register寄存器变量: 寄存器在cpu内部,运算速度非常快,内存的数据必须载入寄存器才能运算,所以频繁使用的变量放在寄存器可以提高效率。 寄存器说明符只能用于函数中的变量和函数中的形参,全局变量与静态变量不能使用。 另...

TomCat的播客 1334

C语言中的auto、static、register和extern的区别

C语言中的auto、static、register和extern的区别 C语言中的每一个变量和函数有两个属性:数据类型和数据的存储类别。数据类型(整形、字符型等),存储类别是指数据在内存中存储的方法,存储方法有两大类:静态存储类和动态存储类。具体包括四种:自动的(auto),静态的(static),寄存器的(register)和外部的(extern)。 auto变量:函数中的局部变量,

qiao1043的专栏 1085

C语言——变量篇(一)变量关键字static、auto、extern、register

前言:笔者最近在看C语言时候遇到了一堆关键字,auto,static,extern,register等等。看上去头皮发麻,在这里整理一下,便于自己理解。 全局变量和局部变量 关于全局变量和局部变量,笔者看过网上和书上各种解释,也是一头雾水,不能完全理解。在本篇中,笔者给出自己理解的全局变量和局部变量的定义如下: 全局变量:定义在模块外的变量。(这里的模块指被一对{}包围的内容) 局部变量:定义在...

qq_36749906的博客 1844

C语言基础:存储类(auto、register、static、extern)

存储类(auto、register、static、extern)

天行健 君子以自强不息,地势坤 君子以厚德载物。 3999

学懂C语言(七):认识C语言存储类auto、register、static、extern

学懂C语言(七):认识C语言存储类auto、register、static、extern

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1523
上一篇: SQL 语句(五)--------------数据查询(集合查询)
下一篇: 指针变量作为函数参数问题
SuilandCoder
博客等级 码龄11年 11粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值