笔记目录
1.局部变量:函数内定义的变量
- 形参、函数内定义的变量、函数内的复合语句内定义的变量
- 在复合语句(程序块)中定义的变量,只在该该定义处到复合语句结束的范围内生效
- 函数内的局部变量定义时要初始化,否则报程序警告,对于局部变量来说,它的值不确定,因为每次调用函数结束后都会释放内存,下次再重新开辟内存,分配存储单元,其分配的存储单元中的值是不可预知的
2.全局变量:函数之外定义的变量
- 有效范围是从定义变量的位置开始到本源文件结束
- 一般习惯全局变量名首字母大写
- 定义时不初始化,系统默认赋初值,该值是该类型的“零值”,一般为0或者NULL
3.变量的存储方式
- 动态存储:是程序在运行期间根据需要动态的进行分配存储空间
- 静态存储:是程序在运行期间由系统分配固定的存储空间
内存中的供用户使用的存储空间情况,分为3部分:
1、程序区
2、静态存储区
3、动态存储区
3.1动态存储区域中应该存放什么数据?
1.形参,调用函数时才给形参分配存储空间
2.函数内定义的非static修饰的变量,既自动变量
3.函数调用时的现场保护和返回地址等(汇编语言有相关内容)
3.2数据的存储类别
在c语言中每一个变量和函数都有两个属性:数据类型和数据存储类别,存储类别如下:
1、自动的(auto),其实就是动态存储,比如局部变量(非static修饰),这类变量也叫自动变量
2、静态的(static),全局变量和被static关键字修饰的局部变量
3、寄存器(register)
4、外部的(extern)
3.3静态局部变量(static修饰)
- 不会因为函数的调用结束而释放内存,继续保留原值,在下一次调用该函数时,这个变量就已经有值(上一次调用结束后的值)
- 作用的范围只能在该函数内,其它函数不可以使用
- 在编译时赋的初值,仅赋初值一次
3.4寄存器变量(register)
- 在程序中某一变量经常被频繁使用,如在某函数中存在一个1000次的循环,每次循环都要引用局部变量,每次引用都要经过取指寻址过程,从而把数据从内存传输到cpu中,相当耗时,这时可以把改变量定义为寄存器变量,这样不需要再去内存中取数据,而是直接在cpu的寄存器里取即可,且寄存器存储数据速度远超于内存,因此更加高效。
- 语法:register 类型 变量名
4全局变量作用域的扩展
4.1在一个文件内部扩展全局变量的作用域
- 如果要在定义全局变量的位置之前的某个函数里使用全局变量,正常是不能使用的,现在使用关键字extern就可以实现,只在要引用全局变量之前使用extern对全局变量进行声明,就表示把该变量的作用域扩展到此,到该函数结束
4.2将全局变量扩展到其他源文件
- 用法同 4.1 一致
- 那么系统是怎么区别到底是在该源文件内扩展还是扩展到其他源文件?这个和追求最近原则,编译时遇到extern时,现在本文件中找全局变量的定义,如果找到了,那么就是属于在一个文件内部扩展,如果找不到,则在编译完后进行链接时从其他文件中找,找到了就将作用域扩展到本文件,如果找不到就按出错处理
4.3将全局变量的作用域限制在本文件中
- 希望某些全局变量只限于本文件引用时,而不被其他文件引用,这时可以在定义全局变量时加一个static修饰,比如:static int A;
- 这类变量叫做:静态全局变量(静态外部变量)
- 注意:全局变量(包含静态和非静态)都放在静态存储区域