变量即可变的量
在内存中开辟一块地址,存放数据
int a = 0;
把这块整型空间命名为a,a即是变量名
将其中的数据替换
a = 1;
此时这块空间存放的数据变为了1
局部变量
存放在栈区,生命周期在它的作用范围内
void hi(){
int a = 1;
}
这里的a即局部变量,定义在函数内部,它的作用范围只在hi这个函数内,函数执行完后,
局部变量a就会被销毁
全局变量
存放在静态区,生命周期是整个程序的开始到结束
int a = 1;
int main(){
return 0;
}
这里的变量a定义在函数之外,地位等同于函数,在程序的任何地方都可以调用它
如果局部变量和全局变量重名,那么优先使用离得近的,也就是局部变量
外部变量
extern修饰的变量是告诉编译器,这个变量在其他文件中定义了,叫他自己去找
文件a.c
int a = 10;
文件b.c
extern int a;
int main(){
printf("%d\n",a);
}
运行时,先编译发现变量a是外部变量,在链接文件时,找到a.c定义的全局变量a的值为10,最终打印a的值为10
这里全局变量a具有外部文件可链接的性质,为什么我要提这一点,请看下面的静态变量
这里顺带提一嘴,extern还可以用来修饰函数,用法是一样的
静态变量
使用static修饰的变量
类似于全局变量,存放在静态区中,在同一个文件里作用相当于全局变量
那不同点在哪里?
文件a.c
static int a = 10;
文件b.c
extern int a;
int main(){
printf("%d\n",a);
}
当运行这段程序时,发现编译出错了
原因在于被static修饰的变量是没有外部可链接的性质的,也就是说extern无法找到它
但是static修饰的变量在它所在的文件中作用范围依然等同于全局变量