c语⾔变量的储存类别及各⾃的特点
C语⾔变量存储类型
auto
static
extern
static extern
register
auto 局部变量
auto 变量是⽤堆栈(stack)⽅式占⽤储存器空间,因此,当执⾏此区段是,系统会⽴即为这个变量分配存储器空间,⽽程序执⾏完后,这个堆栈⽴即被系统收回.在⼤括号{}内声明.
⾃动变量就是指在函数内部定义使⽤的变量。他只是允许在定义他的函数内部使⽤它。在函数外的其他任何地⽅都不能使⽤的变量。⾃动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这
说明⾃动变量也没有链接性,因为它也不允许其他的⽂件访问他。由于⾃动变量在定义他的函数的外⾯的任何地⽅都是不可见的,所以允许我们在这个函数外的其他地⽅或者是其他的函数内部定义同名的变量,他们之间不会发⽣冲突的。因为他们都有⾃⼰的区域性,⽽且它没有链接性(即:不允许其他的⽂件访问他的)。来看看⾃动量的持续性。计算机在执⾏这个函数的时候,创建并为它分配内存,当函数执⾏完毕返回后,⾃动变量就会被销毁。这个过程是通过⼀个堆栈的机制来实现的。为⾃动变量分配内存就压栈,⽽函数返回时就退栈。
static 静态变量
⼀、局部静态变量
局部变量按照存储形式可分为三种auto, static, register。
与auto类型(普通)局部变量相⽐, static局部变量有三点不同:
1. 存储空间分配不同
auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调⽤结束后⾃动释放, ⽽static分配在静态存储区, 在程序整个运⾏期间都不释放. 两者之间的作⽤域相同, 但⽣存期不同.
static修饰的变量2. static局部变量在所处模块在初次运⾏时进⾏初始化⼯作, 且只操作⼀次。
3. 对于局部静态变量, 如果不赋初值, 编译期会⾃动赋初值0或空字符, ⽽auto类型的初值是不确定的.
特点: static局部变量的”记忆性”与⽣存期的”全局性”
所谓”记忆性”是指在两次函数调⽤时, 在第⼆次调⽤进⼊时, 能保持第⼀次调⽤退出时的值.
注意事项:
1. “记忆性”, 程序运⾏很重要的⼀点就是可重复性, ⽽static变量的”记忆性”破坏了这种可重复性, 造成不同时刻⾄运⾏的结果可能不同.
2. “⽣存期”全局性和唯⼀性. 普通的local变量的存储空间分配在stack上, 因此每次调⽤函数时, 分配的空间都可能不⼀样, ⽽static具有全局唯⼀性的特点, 每次调⽤时, 都指向同⼀块内存, 这就造成⼀个很重要的问题 ---- 不可重⼊性
⼆、外部静态变量/函数
在C中static有了第⼆种含义:⽤来表⽰不能被其它⽂件访问的全局变量和函数。, 但为了限制全局变量/函数的作⽤域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储⽅式,⽽是指对函数的作⽤域仅局限于本⽂件(所以⼜称内部函数)。注意此时, 对于外部(全局)变量, 不论
是否有static限制, 它的存储区域都是在静态存储区, ⽣存期都是全局的. 此时的static只是起作⽤域限制作⽤, 限定作⽤域在本模块(⽂件)内部.
使⽤内部函数的好处是:不同的⼈编写不同的函数时,不⽤担⼼⾃⼰定义的函数,是否会与其它⽂件中的函数同名。
extern 变量
外部变量定义在程序外部,所有的函数很程序段都可以使⽤.
外部变量可能会在某⼀程序段被重新定义,以段内变量为参考值.
static extern 变量
静态外部变量和外部变量差别在于,外部变量⽣命可以同时给多个⽂件使⽤,⽽静态外部变量则只能给声明此变量的⽂件使⽤.
register 变量
寄存器变量,是由寄存器分配空间,访问速度⽐访问内存快,加快执⾏速度.寄存器⼤⼩有限.
在c语⾔当中可以使⽤寄存器变量来优化程序的性能,最常见的是在⼀个函数体当中,将⼀个常⽤的变量声明为寄存器变量: register int ra; 如果可能的话,编
译器就会为它分配⼀个单独的寄存器,在整个函数执⾏期间对这个变量的操作全都是对这个寄存器进⾏操作,这时候就不⽤频繁地去访存了,⾃然就提⾼了性能。
不能⽤于全局变量。现在的情况是VC忽略⽤户定义的REGISTER,因此定义⼀个REGISTER变量与不定义⼀个REGISTER是⼀样的,编译器进⾏相同的优化,因为MS认为,REGISTER是系统中宝贵的资源,应该由系统统⼀调配,⽽且认为VC编译器的优化能⼒要⼤于⼀般的程序员。因此也有⼈说register关键字在PC 机(x86CPU)⽆⽤,编译器按⾃动变量处理。
注意: register是不能取址的。
register int j; int *p = &j;是错的,因为⽆法对寄存器的定址。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论