变量的存储类型的研究

C语言中每个变量或者函数都有数据类型和存储类型。数据类型是int、double、float等类型,修饰变量。

数据类型规定了什么?

规定了数据的取值范围和可参与的运算。例如int可以参与取余运算,而double就不能参与取余运算。

内存区域的划分

系统区和用户区。用户区分为程序区、静态存储区、动态存储区。

静态存储区用来存放静态变量,例如全局变量

动态存储区域用来存放动态变量,包括函数调用时的现场信息和函数返回地址,还有函数体内定义的动态局部变量。

存储类型规定了什么?

存储类型规定了变量或函数占用存储空间的方式。

变量的存储类型分为动态存储和静态存储两大类。

如何理解静态存储类型的变量的特点?

这类变量在程序运行期间,由系统分配固定的存储单元,并一直保持不变,直到程序结束。所谓的不变是分配的存储单元不变,不能理解成值不变。“直到程序结束”就是 生存周期是整个main()函数运行期间。

如何理解动态存储类型的变量的特点?

在程序运行期间根据需要进行动态分配内存单元,使用完毕立即释放。如何理解动态两个字,如果一个程序两次调用同一个函数,分配给函数中局部变量的存储空间地址可能是不同的,与静态存储变量形成了对照,故用动态二字描述其内存分配是动态的。函数中的形参就是典型的动态存储类型。

C语言如何规定变量的存储类别?

auto 自动型、register寄存器类型、extern外部型、static静态型

auto和register属于动态类型

auto类型是最常用的,没有添加类型修饰符的变量都是auto的。

auto不能定义在函数体外为什么?

试想,定义在函数体外的没有带存储类型说明符的默认为全局变量的,全局变量是静态存储类型,而又要添加一个auto让它成为动态存储类型,是不可取的。

外部变量(extern)和全局变量是对同一种变量的两种说法。

如何理解外部变量的“外部”两个字。

外部,说明这个变量已经在其他文件中定义了,编译器不用再给它分配空间了。例如,在prg.1cpp中定义了int a,b; int fun();prg2.cpp中只需要 extern int a,b; extern int fun();就可以在prg2中使用变量和函数。在prg2中只是对变量和函数做了声明,而prg1中真正的定义了变量和函数。

静态变量(static)

属于静态存储类型的不一定是静态变量,静态变量的唯一标志是加了static修饰。

静态全局变量和非静态全局变量有什么区别?

静态全局变量只能在本文件内使用。非全局变量可以在整个工程内使用,可以通过外部变量说明调用它,如在另一个文件中extern int a这样使用非静态全局变量,而静态全局变量做不到。

静态局部变量和自动变量的相同和区别?

相同点是,他们都是在函数内部或者符合语句中定义的,属于局部变量。他们两个的作用于都只限于所在的函数体内。

不同点是,自动变量随着函数的结束,他的变量运行结果不会保留下来。再次调用函数时,自动变量会被初始化。而静态局部变量随函数运行一遍后,他的值会保留下来,下次调用时不会被初始化。

一个面试题:static的作用是什么?

1、static修饰的局部变量,会变成局部静态变量,它的值在下次调用时还会保持,不会被初始化

2、static修饰函数,函数不会被外部文件所调用

3、static修饰全局变量时,变量不会被外部文件所调用

2和3的static函数和全局变量私有化,防止被外部调用,这在编程中可是防止手误引起的麻烦。

 

寄存器变量(register)

当一个变量需要反复操作时,可以将其定义为寄存器变量。因为寄存器的存取速度远大于内存的存取速度。

寄存器变量属于动态存储类型,所以只有自动变量和形式参数才可以定义为寄存器变量。其实register可以不用写,应为大多编译器能自动优化,来确定哪些变量register效率高。

整理出现过的所有关键名词

 

变量的存储类型的研究正在上传…重新上传取消变量的存储类型的研究正在上传…重新上传取消

变量的存储类型的研究