一、全局变量、局部变量
全局变量:生存期:自定义开始至程序结束。定义在所有函数之外。
1、全局变量在定义时就已分配内存单元,0,NULL
所以 全局变量==静态存储变量
备注:
1、 一个程序的各个文件中定义的全局变量不能相同(若在不同文件中有相同名字的全局变量,则会出现重定义的错误)int a;如下
2、若其他文件中有需要,则用extern声明即可。提示编译器,此变量的定义要去程序中的其他文件去找。
局部变量 :生存期:仅限于定义他的函数个体。
1、局部变量是函数被调用时才分配的存储空间(开始他 的生存期),函数调用结束,释放它的存储空间(结束表演)。
2、局部与全局变量同名时,在局部变量的作用域内,全局变量不起作用。
然鹅,(在一些函数调用中,我们希望被调函数的变量(即局部变量)),在主函数每次调用被调函数后不再被系统重新初始化
(因为每次调用结束,函数体会释放局部变量的内存空间) ->图二所示
这时,静态局部变量诞生了!(static)
二、static;
静态存储方式
1.1 、在程序运行期间,系统对变量固定的分配存储空间。
1.2、一旦分配存储空间,不再释放内存,直到整个程序运行结束。
实例:①静态局部变量
static int x;
1、生存期:从定义(诞生)至整个程序的运行期。
当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值。
2、局限:加上关键词static,则隐藏了变量或函数的名字,使之成为本文件(模块)私有。
图一
图二
三、内、外部函数
1、内部函数
static int fun(int a,int b);
(函数为本文件私有)仅能被本文件中其他函数所调用;
需要在函数前面加static;
2、外部函数
函数可以被工程中的其他文件函数调用称为外部函数; 当工程其他文件需要调用外部函数时,申明中要extern(当然也可以省略,因为函数本质是外部的)。
但是这种方法需要在程序前对函数原型进行声明,另一种办法便是使用头文件。
将函数原型全部写在头文件里,函数定义写在另一个C文件里,这样就可以在main.c(包含其头文件后)直接调用,凸显main.c的组织逻辑。
(2)动态存储方式
2.1、在程序运行期间,系统对变量动态的分配存储空间
2.2程序运行期间,可根据程序的需求,动态分配
寄存器变量register
(1)为提高程序执行效率,允许将局部变量的值存放于寄存器中(而不必存在内存)中;
(2)常将循环次数较多的循环控制变量即循环体内反复使用的变量声明为寄存器变量;
(3)寄存器变量只能是char,int或指针型;
(4)不允许将全局变量声明为寄存器变量;
四、静态数组,动态数组与const只读修饰符
char ch = 'a';
char *p = &ch;
const char *q = &ch;
这两个指针就不一样了,首先p指针可以通过间接引用修改ch单元里存放的数据,比如p = ‘b’;
但是q就不可以修改ch单元里存放的数据。比如*q = ‘b’;是不可以的。
const修饰符只是告诉编译器该指针指向的内容或者其他变量是只读的,不可以修改。如果你修改那么编译器就会报错的。
静态指针数组:数组长度预先定义好,在整个程序中,一旦给定大小后就无法再改变长度。静态数组自己自动负责释放占用的内存。