C语言程序设计第36讲 变量的存储类别(二)
- 格式:ppt
- 大小:232.50 KB
- 文档页数:8


C变量的作用域,和存储空间分配1.C变量的作用域2.变量修饰符3.动态分配内存4.C变量的存储空间实现机制5.字节对齐.一.概述C变量的作用域C的变量作用域是指一个变量在一个程序中能被有效访问范围.按范围来划分,分为变量的作用域分为局部、全局、文件三种范围.变量的作用域都是通过它在程序中的位置隐式说明的。
因此开发者必须对变量的作用域有所了解.变量的存储变量是对程序中数据的存储空间的抽象,变量存储包括两种情况,一种是被链接器链接成可执行程序后,变量在可执行程序文件里所占的空间.一种是运行后变量在内存所占空间的分布.两种情况要分开讨论.前者我们称为存储态,后者称为运行态.两者有共同点也有区别,在后面将分开讨论.C变量的作用域属于C语言的语法问题,所有标准C程序都遵循相同规则.如果错误的使用常造成无法编译通过.但是讨论变量存储不能脱离CPU,操作系统和编译器的类型来谈,特别对需要经常在不同操作系统下编程的开发者.但是此类问题有一定共性.为方便讨论,后文均指32位CPU和Windows 操作系统.对变量的存储理解不清楚,最常犯的错识就是对不能修改的字符串区进行修改造成程序崩溃.二.变量的作用域C的变量作用域是指一个变量在一个程序中能被有效访问范围.按范围来划分,分为变量的作用域分为局部、全局、文件三种范围.1.局部作用域声明在函数内部的变量都是局部作用域,无法被其他函数的代码所访问。
函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块。
还有一种特殊是函数中的用{}包括语句块定义变量也是局部作用域,而且只在语法块里有效.上面例子里的三个num变量都是局部变量,只在本身函数里可见。
,在两个函数出现同名的变量不会互相干扰。
但同一函数定义同名变量,最内层会覆盖外层同名变量(上例中红色num 会覆盖蓝色num,在执行完语法块后,红色num失效,程序对num的引用又变成了对函数参数的引用).所以上面的两个输出,在主函数里仍然是5,在add()函数里输出是1,6。
C语言变量的类型变量要有变量名,在内存中占据一定的存储单元,存储单元里存放的是该变量的值。
不同类型的变量其存储单元的大小不同,变量在使用前必须定义。
那么C语言变量的类型有哪些呢,一起来看看!(一)整型变量整型变量分为4种:基本型(int)、短整型(shortint或short)、长整型(longint或long)和无符号型(unsignedint,unsignedshort,unsignedlong)。
不同的编译系统对上述四种整型数据所占用的位数和数值范围有不同的规定。
类型说明符说明:单词signed来说明“有符号”(即有正负数之分),不写signed也隐含说明为有符号,unsigned用来说明“无符号”(只表示正数)。
(二)实型变量C语言中,实型变量分为单精度类型(float)和双精度类型(double)两种。
如:floata,b;doublem;在vc中,float型数据在内存中占4个字节(32位),double型数据占8个字节。
单精度实数提供7位有效数字,双精度实数提供15~16位有效数字。
实型常量不分float型和double型,一个实型常量可以赋给一个float型或double型变量,但变量根据其类型截取实型常量中相应的有效数字。
注意:实型变量只能存放实型值,不能用整型变量存放实型值,也不能用实型变量存放整型值。
(三)字符变量字符变量用来存放字符常量,定义形式:char变量名;其中关键字char定义字符型数据类型,占用一个字节的存储单元。
例:charcr1,cr2;cr1=‘A’,cr2=‘B’;将一个字符赋给一个字符变量时,并不是将该字符本身存储到内存中,而是将该字符对应的ASCII码存储到内存单元中。
例如,字符′A′的ASCII码为65,在内存中的存放形式如下:01000001由于在内存中字符以ASCII码存放,它的存储形式和整数的存储形式类似,所以C语言中字符型数据与整型数据之间可以通用,一个字符能用字符的形式输出,也能用整数的形式输出,字符数据也能进行算术运算,此时相当于对它们的ASCII码进行运算。
1.存储类型和数据类型。
存储类型是针对变量而言的,它规定了变量的存储位置,从而也确认了其作用域和生存期;数据类型也可以针对变量,它规定了变量所占内存空间的大小。
2.C中只有两种存储类型:自动类和静态类。
全局变量只能是静态类,而局部变量可以任意。
3.说明变量存储类型的格式:<存储类型> <数据类型> <变量名表>;(存储/数据类型可以交换次序),与存储类别有关的说明符:auto(自动),static(静态),register(寄存器),extern (外部)。
4.计算机内存分三部分:动态存储区(堆栈)、静态存储区、程序代码区。
动态存储区用来保存函数调用时的返回地址、自动类别的局部变量等;静态存储区用以存放全局变量及静态类别的局部变量;程序代码区存放各类代码。
5.C++中,可以用static说明"静态函数",其不允许嵌套定义,也不允许外部编译单元中的函数对它进行调用。
******************************************************************************/ #include<stdio.h>/******************************************************************************1.对于全局变量可以使用extern和static两种说明符。
2.全局变量的定义只能出现一次,在定义全局变量时,不可使用extern说明符。
3.全局变量的说明(使用extern)可多次出现在需要的地方,说明的作用是扩展该全局变量的作用域,可以对同一变量进行多次extern声明。
4.全局变量的生存期是整个程序的运行时间。
5.全局变量可以进行不同函数之间的传值。
******************************************************************************/ int i=10; //注意:extern int i=10;是一个具体变量的定义,不是外部变量的声明int main(){/****************************************************************************** 1.static局部变量只有在第一次执行时才进行初始化,若定义时没有指定初值,编译器自动为其赋0。