文件作用范围
int total;
int max();
作用范围:从声明的位置开始,到文件末尾
函数作用范围
程序块作用范围
函数原型作用范围
变量的声明
声明:给编译器看的,告知有这么一个变量,但是此变量是在别的文件里定义的。方便编译器做类型检测
extern int a;//正确的写法 extern 声明的关键字
定义:为变量要开辟内存空间
一个全局变量可否被多次定义?不可以
一个全局变量可否被多次声明?可以
int total;
int max(int ,int);
int main(){
}
这个total 是声明还是定义呢?如果整个文件里只有一个total,就是定义,定义没有赋初始值,如果在别的文件里也有int toal=10;这个total 就退化成声明了。
对于变量,定义意味着创建,即为其分配内存
auto自动变量:
所有自动变量的声明周期就是变量所在的大括号范围
局部变量的缺省类别
register 自动变量
变量都是在内存当中。如果能把变量放到cpu的寄存器里面,代码执行效率会更高。
register int b;
优先分配寄存器,而不分配内存,但不是绝对分配寄存器。因为cpu的寄存器是按照个数的。arm 37个,x86 17个 。个数太少的时候,是不会分配的。
static(静态变量):可以用于在程序块中定义的变量
退出程序库后依然存在。并保留值
但不改变其作用范围,既只能在所在的程序块内被使用。
会自动初始化,缺省值为0或'\0'
#include <stdlib.h>
int fun(void)
{
static int a = 10; //静态局部变量,作用域本函数内,声明周期整个程序运行结束时才释放,并且a的初始化赋值一次。
printf("%d\n",a);
a++;
return 0;
}
int main(){
fun();
fun();
fun();
return 0;
}
不是在代码块中
static int a = 10; //限定了作用域,a只能在本文件内使用,未初始化的全部变量是0
int fun(){
}