7.6 变量的存储和引用,内部和外部函数
一、变量的存储类别
1.从变量存在的时间(生存期)角度来划分,我们可以把变量划分未:静态存储变量 和 动态存储变量。
从而引出 静态存储方式 和 动态存储方式。
静态存储变量:在程序运行期间分配固定存储空间的变量。
动态存储变量:在程序运行期间根据需要进行动态分配存储空间的变量。
全局变量(在函数的外部定义的)放在静态存储区中,程序开始执行的时候给全局变量分配存储区,程序执行完毕后释放这些存储区。
在程序执行过程中它们占据固定的存储单元,而不是动态的分配和释放。
动态存储区中存哪些数据:
1.函数形参。函数形参被看做是局部变量。
2.局部变量,比如函数内定义的一些变量。
3.函数调用时现场的一些数据和返回地址等。
一般来讲,这些数据在函数调用开始时分配存储空间,函数调用完毕,这些空间就被释放了。这种分配和释放,我们就认为是动态的。
如果你两次调用同一个函数,分配给此函数的局部变量等等的存储空间地址可能就是不同的。
二、局部变量的存储方式
1.传统情形:
函数的局部变量:函数被调用时分配存储空间,函数执行完成后自动释放其所占用的存储空间。
2.特殊情形:
局部静态变量:用static加以说明;能够保留原值,占用的存储单元不释放。在下一次调用函数时,该变量的值,就是上一次该函数调用结束时的值。
局部静态变量说明:
(1)在静态存储区内分配存储单元,程序整个运行期间不释放。
(2)局部静态变量在编译时赋予初值的,只赋予初值一次,在程序运行的时候,它已经有了初值。
以后每次调用函数时不再重新赋初值,而是保留上次函数调用结束时的值(普通局部变量的定义和赋值是在函数调用时进行的);
(3)定义局部静态变量时,如果不赋予初值,则编译时自动赋予初值0,而普通的局部变量,如果不赋予初值,则该普通局部变量是一个不确定的值。
(4)虽然局部静态变量在函数调用结束后仍然存在,但其他函数时不能引用它的。
(5)缺点:长期占用内存,降低了程序的可读性。
结论:除非必要,否则不要多用局部静态变量。
三、全局变量跨文件引用
extern 做一个外部变量说明
在引用该全局变量的文件中的头部做一个“外部变量说明”就可以。说明这里出现的变量是一个已经在其他文件中定义过的外部变量,本文将不必再为它分配内存了。
在定义全局变量时前面加static ,则该全局变量只能在本文件中使用。
四、函数的跨文件调用
我们根据函数是否能被其他源文件调用,我们将函数分为 内部函数 和 外部函数。
内部函数:只能被本文件中其他函数调用。定义内部函数的时候,在函数定义最前边加一个static ,形式如下:
static 类型标识符 函数名(形参表){…}
内部函数又称为“静态函数”,使用内部函数,可以使函数只局限于所在文件。
外部函数:如果一个函数定义,你不用static ,他就是外部函数,当然,你可以定义该函数前边添加一个extern,但默认就是extern。
extern 类型标识符 函数名(形参表){…}
五、static关键字用法总结
1.函数内部定义一个变量的时候使用static,则该变量会保存在静态存储区,在编译的时候被初始化,如果你不给初始值,他的值会被初始化为0,并且,下次调用该函数时,该变量保持上次离开该函数的值。
2.在全局变量之前增加static,会导致该全局变量,只能被本文件引用,无法再其他文件引用。
3.在函数定义之前加static,那么会导致该函数只能在本文件中被调用,无法再其他文件中被调用,