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

2023-11-10

转载地址: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(……) /*定义外部函数*/   {……} 





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言中auto、register、extern、static用法 的相关文章

随机推荐

  • 使用ansible中的playbook

    1 Playbook 的功能 playbook 是由一个或多个 play 组成的列表 Playboot 文件使用 YAML 来写的 2 YAML 简介 YAML 是一种表达资料序列的格式 类似XML Yet Another Markup L
  • MySQL修改密码的3种方式以及启动方式

    在使用数据库时 我们也许会遇到 MySQL 需要修改密码的情况 比如密码太简单需要修改等 本节主要介绍了 3 种修改 MySQL 数据库密码的方法 使用 SET PASSWORD 命令 步骤 1 输入命令mysql u root p指定 r
  • xp无法访问查找工作组计算机,一招教你搞定XP“网上邻居”、“查看工作组计算机”打不开的情况...

    作 者 杜超 2号 ID 16058 城市 江阴 摘 要 一招教你搞定XP 网上邻居 查看工作组计算机 打不开的情况 正 文 在一些被优化过的XP系统或刚安装好的系统中 有时我们要访问局域网上的其他共享打印机或文件夹 需要用到网上邻居 可是
  • TCP协议疑难杂症全景解析

    原文地址 http blog csdn net dog250 article details 6612496 说明 1 本文以TCP的发展历程解析容易引起混淆 误会的方方面面 2 本文不会贴大量的源码 大多数是以文字形式描述 我相信文字看起
  • multiset和set,map和multimap的区别

    一 set和multiset的差异和相同 set是一个集合容器 其中所包含的元素是唯一的 集合中的元素按一定的顺序排列 元素插入过程是按排序规则插入 所以不能指定插入位置 set采用红黑树变体的数据结构实现 红黑树属于平衡二叉树 在插入操作
  • 查看GPU使用的最佳方式

    1 watch n 1 nvidia smi 最有名 没有之一 nvidia自带了一个nvidia smi的命令行工具 会显示GPU使用情况 作为监控 GPU 的工具就显得有点过于简陋了 比如 Process name 栏只显示命令行的程序
  • Redis布隆过滤器详解

    目录 一 前言 二 RedisBloom 安装与使用 三 RedisBloom 常用命令汇总 四 通过 Jedis 使用 RedisBloom 五 Redisson 封装的布隆过滤器 六 使用哪种方式的过滤器比较好 一 前言 布隆过滤器 B
  • 【数据结构与算法】时间复杂度与空间复杂度

    目录 一 前言 二 时间复杂度 1 概念 二 大O的渐进表示法 概念 总结 三 常见时间复杂度计算举例 例1 例2 例3 例4 例5 计算冒泡排序的时间复杂度 例6 二分算法的时间复杂度 例7 阶乘递归Fac的时间复杂度 例8 斐波那契递归
  • js异步提交form表单之serialize()方法及FormData对象

    serialize 和FormData对象都可将表单数据序列化 后通过ajax异步提交 但二者有实质区别 1 serialize serialize 是JQuery方法 可序列化表单值创建 URL 编码文本字符串 就是将表单数据以字符串的形
  • 浏览器的工作原理

    浏览器可以被认为是使用最广泛的软件 本文将介绍浏览器的工 作原理 我们将看到 从你在地址栏输入google com到你看到google主页过程中都发生了什么 将讨论的浏览器 今天 有五种主流浏览器 IE Firefox Safari Chr
  • java.lang.UnsatisfiedLinkError: No implementation found for

    E AndroidRuntime FATAL EXCEPTION main Process com example pimr PID 20314 java lang UnsatisfiedLinkError No implementatio
  • leecode刷题笔记-数组

    数组题注意事项 1 切记while循环的循环条件一定要判断遍历长度是否越界且要先判断该条件 否则就会报错 例如 while j
  • 50道编程小题目之【分解质因数】

    题目 将一个正整数分解质因数 例如 输入90 打印出90 233 5 python解题代码 ii int input 请输入一个正整数 jj 2 ii b ii fj while jj lt ii if ii jj 0 if ii jj f
  • linux下安装helm

    我这里使用的系统是centos7 6 Helm是一个kubernetes应用的包管理工具 用来管理charts 预先配置好的安装包资源 有点类似于Ubuntu的 apt 和CentOS中的 yum 方式一 使用官方提供的脚本一键安装 点击查
  • wallhaven.cc网站图片超清壁纸爬虫

    测试时间 2021 02 16 1 参考博客 2 python代码 1 参考博客 From 侵删 https blog csdn net qq 41849471 article details 89607706 2 python代码 图片保
  • python search用法,Python-re中search()函数的用法详解(查找ip)

    1 首先来看一下search 和find 的区别 import re s1 2221155 search 字符串第一次出现的位置 print re search 1 s1 print s1 find 1 它们的输出分别是 search 函数
  • 苹果系统itunes连iphone连不上服务器,itunes不识别iphone,iPhone连接不上iTunes怎么解决?连接不上iTunes怎么办?...

    今天一网友求助 itunes不识别iphone iPhone手机插上电脑后可以弹出设备 在电脑里面可以显示并能打开手机的相册 怎么样iphone也连不上iTunes 而换另外的一个iPhone连接又很正常 iPhone连接不上iTunes怎
  • 6-17 使用函数实现字符串部分复制 (20 分)

    6 17 使用函数实现字符串部分复制 20 分 本题要求编写函数 将输入字符串t中从第m个字符开始的全部字符复制到字符串s中 函数接口定义 void strmcpy char t int m char s 裁判测试程序样例 include
  • 使用JSONP解决跨域

    1 首先需要知道什么是跨域 浏览器从一个域名的网页去请求另一个域名的资源时 域名 端口 协议任一不同 都是跨域 出于浏览器的同源策略限制 同源策略 Sameoriginpolicy 是一种约定 它是浏览器最核心也最基本的安全功能 如果缺少了
  • c语言中auto、register、extern、static用法

    转载地址 http www 111cn net net c 38998 htm 四种存储类别说明符有两种存储期 自动存储期和静态存储期 auto和register对应自动存储期 具有自动存储期的变量在进入声明该变量的程序块是被建立 它在该程