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

更新时间:2023-06-14 23:51:18 阅读: 评论:0

【c语⾔】关键字存储类型讲解
(auto,extern,static,register,const)
渣渣C的学习之路
⽤最简单的话,让你最快速明⽩!
C语⾔中,每⼀个变量和函数都有2个属性:数据类型和数据的存储类别。C的存储类别有4种:⾃动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。变量的存储类别对应变量的作⽤域与⽣命周期。
<
extern外部声明,简单来说:你如果要在a.c中使⽤b.c的⼀个变量avg,直接使⽤是会报错的,这时候我们便需要⽤
remote control
extern int avg; 在a.h中声明avg,这样就可以引⽤avg了
当然你要保证avg是⼀个全局变量,局部变量不能⽤extern的修饰,且局部变量在运⾏时才在堆栈部分分配内存。
注意事项:
1.外部声明可以多次,定义只能⼀次
简单来说就是avg只能定义⼀次,但是可以有很多外部声明
平子理沙extern int a;//声明⼀个全局变量a
int a; //定义⼀个全局变量a
extern int a =0 ;//定义⼀个全局变量a 并给初值。
int a =0;//定义⼀个全局变量a,并给初值,
int a 等于 extern int a,都是定义⼀个可以被外部使⽤的全局变量,并给初值。
但是注意定义只能出现在⼀处。不管是int a;还是extern int a=0;还是int a=0;都只能出现⼀次,⽽extern int a,extern a可以出现很多次。
2.⽤extern声明外部变量时,类型名可写可不写,如"extern int num;"也可以写成"extern num;"。因为它不是定义变量,可以不指定类型,只许写出外部变量名即可
蚕食是什么意思3.变量如果只是⽤到声明,放在.h中就⾏了;
如果声明的同时并定义⼀个全局变量的话,在.h⾥⽤extern声明,并在对应的.c⾥定义。
其它的.c⽂件直接include“xx.h”就⾏了
// ---- Math.h ----
青岛大学怎么样
extern "C";
// ---- Math.C ----
int “C”;
// ---- Add.c ----
#include "Math.h"
C=5;
// C 可以从被调⽤
这样⼦是不是很⽅便!
2.auto
auto被解释为⼀个⾃动存储变量的关键字,也就是申明⼀块临时的变量内存。函数中的形参和在函数中定义的局部变量(包括符合语句中的局部变量)都属于此类。如 函数中定义变量 int a; 和 auto int a; 是等价的,关键字“auto”是默认省略的,此关键字很少使⽤
注意事项:
1.auto是定义,即只能在定义的范围内使⽤(⼀般就是在花括号⾥{})全局变量默认说明符为extern。
2.auto变量在离开作⽤域是会变程序⾃动释放,不会发⽣内存溢出情况(除了包含指针的类)使⽤auto变量的优势是不需要考虑去变量是否被释放,⽐较安全。(局部变量)
3.auto不能作为函数的参数
4. auto不能直接⽤来声明数组
3.static
这个关键字很重要,我们需要对他很了解
我们分为⼏点来介绍他
1.
我们知道局部变量在调⽤完之后就会销毁,⽽我们有时希望函数中的局部变量的值在结束后不消失⽽继续保留原值,即其占⽤的不释放,在下⼀次再调⽤该函数时,该变量已有值(就是上调⽤结束时的值)。这时就应该指定该局部变量为“静态局部变量”,⽤关键字static进⾏声明。
2.static在修饰全局变量时,该变量只能在当前⽂件中使⽤,其他⽂件⽆法访问和使⽤,即时⽤extern声明也是⽆效的,但是可以在多个⽂件中定义同⼀个名字的变量,不会受到影响
静态函数只能在声明它的⽂件中可见,其他⽂件不能引⽤该函数
不同的⽂件可以使⽤相同名字的静态函数,互不影响
static避免多个⽂件使⽤了相同的变量名⽽导致冲突,
 ⽐如有多个⽂件,分别由⼏个⼈独⽴开发的。假定他们在各⾃的⽂件中定义相同的“全局”变量名(
仅仅指在他们独⾃的⽂件中全局),当系统集成时,由于他们使⽤了名字⼀样的“全局”变量,导致有难于遇见的问题。解决这个问题⽅便的做法就是在各⾃⽂件中,在相同的全局变量申明前加上static修饰符。这样系统就会为他们分配不同的内存,互不影响了。
3.static修饰⼀个函数,则这个函数同样只能在本⽂件中调⽤,不能被其他⽂件调⽤
4.Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候⾃动初始化为0; 并且在程序执⾏期间不销毁,程序执⾏完成之后才销毁(在静态存储区,内存中所有字节默认都是0x00)
下⾯是中兴通讯2012校招笔试题的⼀道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
  全局变量本⾝就是静态存储⽅式, 静态全局变量当然也是静态存储⽅式。 这两者在存储⽅式上并⽆不同。
  这两者的区别在于⾮静态全局变量的作⽤域是整个源程序, 当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。 ⽽静态全局变量则限制了其作⽤域, 即只在定义该变
量的源⽂件内有效, 在同⼀源程序的其它源⽂件中不能使⽤它。由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
  static全局变量只初使化⼀次,防⽌在其他⽂件单元中被引⽤; 
2.  static局部变量和普通局部变量有什么区别 ?
  把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。
conquence
  static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值; 
3.  static函数与普通函数有什么区别?
  static函数与普通函数作⽤域不同,仅在本⽂件。只在当前源⽂件中使⽤的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源⽂件中说明和定义。对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件.
词源学
register变量表⽰将变量存储在CPU内部寄存器中,⽽不是单纯地寻址访问,这样可以提⾼运算速度和效率,
那么有的同学可能要问,为什么寄存器⽐寻址访问要快呢?我们⾸先要知道,CPU是不会直接和内存打交道的,他是会通过寄存器跟内存打交道,数据从内存⾥拿出来先放到寄存器,然后CPU 再从寄存器⾥读取数据来处理,处理完后同样把数据通过寄存器存放到内存⾥,
是阶层中的最顶端
正是有着各种各样各⾃功能的寄存器(很多部门),负责着不同的⼯作处理,然后汇报给CPU,这样程序才能正常进⾏,  这样我们可以知道,寄存器其实就是⼀块⼀块⼩的存储空间,只不过其存取速度要⽐内存快得多。进⽔楼台先得⽉嘛,它离CPU 很近,所以寄存器变量,也就是要优先处理啦。
注意事项:
我们知道寄存器是有限的(各个部门),如果定义了很多register变量,可能会超过CPU的寄存器个数,超过容量,(各个部门超负载了)
这时候就没有办法都变为寄存器变量了,这个数量主要看机器性能决定
这通常意味着register变量必须是⼀个单个的值,并且长度应该⼩于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。  (这个我们很容易理解,不是什么事都能作为⼤事的)
3.因为register变量可能不存放在内存中,所以不能⽤“&”来获取register变量的地址。
接待礼仪培训
4.⽤register修饰的变量只能是局部变量,不能是全局变量。CPU的寄存器资源有限,因此不可能让⼀个变量⼀直占着CPU寄存器      (⼈不可能⼀直只处理⼀件事情)
6.局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;
虽然它被称作最近快的变量,但是也是⽐较不安全的变量,现在使⽤不多
我对这个关键字⼀直抱有敬畏之⼼,因为之前看过⼀位某国企⾯试官对⾯试者提问const时的博客,就⼀直感觉很有⽂章
简单来说:我们在写程序时,如果需要让⼀个变量保持不变,不能被修改,那就⽤const来修饰
const 是 constant 的缩写,意思是“恒定不变的”!
以下两种定义是相同的
vogconst int a = 6;
int const a = 6;
⽤ const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以,所以在定义常量的时候要先给他初始化(赋值)  ,后⾯任何修改的操作都是错误的
const和指针
int main()
{
const int a;
int const b;
const char *c;
char *const d;
const char * const e;
return 0;
}
看上⾯代码, a和b是相同的cigarette
对于c来说 const在*左边 表⽰c所指向的内存地址不可改变,即c只能指向⼀个固定地址,但是地址中的值是可以修改的
对于d来说,指针是只读的,也就是 d 本⾝的值不能被修改,但是它所指向的内存空间是可以被修改的。
对于e来说,不能做任何修改,
常量:固定值
ens变量:可以变化的量
我们知道,数组的长度不能是变量。虽然 const 定义的是只读变量,就相当于是定义⼀个常量。但是只读变量也是变量,所以 const 定义的变量仍然不能作为数组的长度
请注意只读这两个字,可以说是精华所在
能⼒提升:
⽤ const 修饰的变量,⽆论是全局变量还是局部变量,⽣存周期都是程序运⾏的整个过程。全局变量的⽣存周期为程序运⾏的整个过程这个是理所当然的。⽽使⽤ const 修饰过的局部变量就有了静态特性,它的⽣存周期也是程序运⾏的整个过程。我们知道全局变量是静态的,静态的⽣存周期就是程序运⾏的整个过程。但是⽤const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。
我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,⽽经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。
有兴趣同学可以参考
来学习⼀下
都看到这⼉了,点个赞再⾛呗!

本文发布于:2023-06-14 23:51:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/956110.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:变量   静态   寄存器   全局变量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图