auto,register,Static

auto:

最宽宏大量的关键字。因为在缺省的情况下,编译器默认所有变量都是auto的。而它与C语言中提供的四种存储说明符(auto,register,extern,static)中的register对应存储类别说明符的两种存储期(自动存储期和静态存储期)的自动存储期。那么剩下的extern,static就是用来说明静态存储期的变量和函数。

函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态地分配存储空间的。函数的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类。在调用该函数时,系统给形参和函数中定义的变量分配存储空间,数据存储在动态存储区中。在函数调用结束时就自动释放这些空间。如果是在复合语句中定义的变量,则在变量定义时分配存储空间,在复合语句结束时自动释放空间。因此这类局部变量称为自动变量(auto variable)。自动变量用关键字auto作存储类别的声明。

存储类别auto和数据类型int的顺序任意。关键字auto可以省略,如果不写auto,则系统把它默认为自动存储类别,它属于动态存储方式。程序中大多数变量属于自动变量。在函数体中以下两种写法作用相同:

Auto int i = 1;
int i = 1;


register:

最快的关键字。为什么这样说呢?因为这个关键字请求编译器尽可能地将变量存在CPU内部的寄存器中,而不是通过内存寻址访问以提高效率。但是,要注意,这里是尽可能,而不是绝对。因为,寄存器数量是有限的,如果用户都用定义为register变量的话,是不可能全部都能放进寄存器的。

一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。

注意:虽然提高效率,但是好的东西都要去遵守或注意某些事项,而register当然也不例外。Register变量必须是能被CPU寄存器所接受的类型。这就意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度,而且register变量可能不存放在内存中,所以是不能用取址运算符“&”来获取register变量的地址。


Static:

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。当加上static关键字修饰后,该变量或函数就会被隐藏。

此关键字可分别修饰变量和函数。

变量:

static修饰的变量和全局变量都是存储在内存的静态区。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。而static修饰的变量可分为局部变量和全局变量。这里要注意其作用域。若是静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使使用extern也不使用。准确地说,作用域是从定义之处开始到文件结尾处结束。静态局部变量。如果其在某个函数体内定义,其作用域只限于本函数,本文件中其他函数也不能使用。而且下次调用时候其值为上次改动后的值,当然没有改动的话就是原来的值。因为区存在于内存的静态区。

函数:

在函数前加上static关键字的话,此函数就成为静态函数。注意,这里的静态不同于变量,这里静态的作用只是对其他的文件此函数不可见,并不是指此函数存储在静态内存区中。所以一般又称为内部函数。这个内部函数的好处就是在不同的人编写不同的函数时,不需要担心自己定义的函数是否与其他文件中的函数同名。

 

存放在静态内存区的变量其初始值都为0. 在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值