c语言变量的储存类别及各自的特点
发布时间:2025-05-17 17:35:44 发布人:远客网络
一、c语言变量的储存类别及各自的特点
auto变量是用堆栈(stack)方式占用储存器空间,因此,当执行此区段是,系统会立即为这个变量分配存储器空间,而程序执行完后,这个堆栈立即被系统收回.在大括号{}内声明.
自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。
局部变量按照存储形式可分为三种auto, static, register。
与auto类型(普通)局部变量相比, static局部变量有三点不同:
auto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调用结束后自动释放,而static分配在静态存储区,在程序整个运行期间都不释放.两者之间的作用域相同,但生存期不同.
2. static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。
3.对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的.
特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时,在第二次调用进入时,能保持第一次调用退出时的值.
1.“记忆性”,程序运行很重要的一点就是可重复性,而static变量的”记忆性”破坏了这种可重复性,造成不同时刻至运行的结果可能不同.
2.“生存期”全局性和唯一性.普通的local变量的存储空间分配在stack上,因此每次调用函数时,分配的空间都可能不一样,而static具有全局唯一性的特点,每次调用时,都指向同一块内存,这就造成一个很重要的问题----不可重入性!!!
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。,但为了限制全局变量/函数的作用域,函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时,对于外部(全局)变量,不论是否有static限制,它的存储区域都是在静态存储区,生存期都是全局的.此时的static只是起作用域限制作用,限定作用域在本模块(文件)内部.
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
外部变量定义在程序外部,所有的函数很程序段都可以使用.
外部变量可能会在某一程序段被重新定义,以段内变量为参考值.
静态外部变量和外部变量差别在于,外部变量生命可以同时给多个文件使用,而静态外部变量则只能给声明此变量的文件使用.
寄存器变量,是由寄存器分配空间,访问速度比访问内存快,加快执行速度.寄存器大小有限.
在c语言当中可以使用寄存器变量来优化程序的性能,最常见的是在一个函数体当中,将一个常用的变量声明为寄存器变量: register int ra;如果可能的话,编译器就会为它分配一个单独的寄存器,在整个函数执行期间对这个变量的操作全都是对这个寄存器进行操作,这时候就不用频繁地去访存了,自然就提高了性能。
不能用于全局变量。现在的情况是VC忽略用户定义的REGISTER,因此定义一个REGISTER变量与不定义一个REGISTER是一样的,编译器进行相同的优化,因为MS认为,REGISTER是系统中宝贵的资源,应该由系统统一调配,而且认为VC编译器的优化能力要大于一般的程序员。因此也有人说register关键字在PC机(x86CPU)无用,编译器按自动变量处理。
register int j; int*p=&j;是错的,因为无法对寄存器的定址。
二、C语言中%c是什么意思
这是C语言的格式输出,%c,%y这些代表你要输出的数据的数据类型;%d表示输出十进制有符号的整数。
6、%e表示输出指数形式的浮点数。
7、%x,%X表示输出无符号以十六进制表示的整数。
8、%0表示输出无符号以八进制表示的整数。
9、%g表示输出自动选择合适的表示法。
5、\xhh表示一个ASCII码用16进表示,其中hh是1到2个16进制数。
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。
double x=0.12345678912345678;
三、在C语言中,存储类别包括
TurboC2.0支持四种变量存储类型。说明符如下:
局部变量是指在函数内部说明的变量(有时也称为自动变量)。用关键字auto进
行说明,当auto省略时,所有的非全程变量都被认为是局部变量,所以auto实际上
局部变量在函数调用时自动产生,但不会自动初始化,随函数调用的结束,这
个变量也就自动消失了,下次调用此函数时再自动产生,还要再赋值,退出时又自
static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
它与局部变量的区别在于:在函数退出时,这个变量始终存在,但不能被其它
函数使用,当再次进入该函数时,将保存上次的结果。其它与局部变量一样。
TurboC2.0允许将大型程序分成若干独立模块文件分别编译,然后将所有模块
的目标文件连接在一起,从而提高编译速度,同时也便于软件的管理和维护。静态
全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与
全程变量的区别是:全程变量可以再说明为外部变量(extern),被其它源文件使用,
而静态全程变量却不能再被说明为外部的,即只能被所在的源文件使用。
extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外,还要
被其它文件使用。因此,必须将全程变量通知每一个程序模块文件,此时可用
register称为寄存器变量。它只能用于整型和字符型变量。定义符register说
明的变量被TurboC2.0存储在CPU的寄存器中,而不是象普通的变量那样存储在内
存中,这样可以提高运算速度。但是TurboC2.0只允许同时定义两个寄存器变量,
一旦超过两个,编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量
来处理。因此,寄存器变量常用在同一变量名频繁出现的地方。
另外,寄存器变量只适用于局部变量和函数的形式参数,它属于auto型变量,
因此,不能用作全程变量。定义一个整型寄存器变量可写成:
对于以上所介绍的变量类型和变量存储类型将会在以后的学习中,通过例行程
序中的定义、使用来逐渐加深理解。