7.C(变量类型和作用域)
1.普通局部变量
1)在{}内部定义的变量就是局部变量
2)只有执行到定义变量的这个语句,系统才会给这个变量分配空间
3)当离开{},这个非static局部变量自动释放
4)局部变量的作用域在当前的{}。离开后无法使用
5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
6)不同的{}中,变量名字可以一样
7)普通局部变量不初始化,它的值为随机数
2.static局部变量
1)在{}内部定义的变量就是局部变量
2)static局部变量,在编译阶段就已经分配空间,函数没有调用前,它已经存在
3)当离开{},static局部变量不会释放,只有程序结束,才会释放
4)局部变量的作用域在当前的{}。离开后无法使用
5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
6)不同的{}中,变量名字可以一样
7)static局部变量不初始化,值默认为0
8)static局部变量初始化语句,只会执行一次,但是可以赋值多次
9)static变量只能用常量赋值
#include <stdio.h>
void fun() {
static int i = 0;
i++;
printf("i = %d\n", i);
//static int j = i; err static变量只能用常量赋值
}
int main() {
fun();
fun();
fun();
system("pause");
}
3.普通局部变量和static局部变量的区别
内存分配和释放
1)普通局部变量只有执行到定义的语句才分配空间;static变量在编译阶段已经分配
2)普通局部变量离开作用域自动释放;static局部变量在整个程序结束释放
初始化
1)普通局部变量如果不初始化,值为随机数;static局部变量如果不初始化,值为0(int)
2)static 局部变量初始化语句只有第一次执行时有效
3)static局部变量只能用常量初始化
3.普通全局变量
1)在{}外面,也就是函数外面定义的变量为全局变量
2)只要定义了全局变量,任何地方都能使用此变量
3)如果使用变量时,在前面找不到此全局变量的定义,需要先声明后再使用
4)全局变量不初始化,默认值为0
5)在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误),可以声明多次
7)全局变量在编译阶段已经分配空间,在整个程序执行完毕释放
#include <stdio.h>
void fun() {
//这样是错误的,虽然a是全局变量,但却在fun方法的后边定义,编译器编
//译代码是从上往下的,所以在编译fun方法的时候,没有找到a的定义,这时候
//需要声明一下才行
//printf("a = %d\n",a);
extern int a; //注意声明的时候不要赋值
printf("a = %d\n",a);
}
int a = 10;
int main() {
fun();
system("pause");
}
4.在多个文件中使用普通全局变量
假设我创建了一个a.c的文件,在这个文件中定义了一些变量和方法,这些变量和方法会在多个类中使用,如下 a.c
int a = 0;
int b = 0;
void test() {
a = 10;
b = 20;
}
假设我在1.c和2.c文件中都要调用test方法并且为ab赋值,那么需要这样做,使用之前要添加变量和方法的声明
a.c
#include <stdio.h>
extern void test();
extern int a;
int main() {
test();
a = 100;
system("pause");
}
2.c
#include <stdio.h>
extern void test();
extern int a;
int haha() {
a = 1009;
system("pause");
}
那么这样一来是非常繁琐的,假设a.c中有一百个方法一百个变量,另外有一百个文件都要用到a.c中的一百个方法和一百个变量,那么就要重复的在这一百个文件中声明这一百个变量和方法了,也就是同一个声明做了一百次,这样是毫无意义的,所以才有了头文件,a中的所有变量和方法都可以声明在一个头文件中,这样那一百个需要使用a中成员的文件只需要引入这个头文件即可,大大简化了无效代码,所以上边的三个文件可以这样写
注意:不要在头文件中给变量赋值,(赋值之后相当于声明并定义了一个变量),此时如果在多个文件中引入这个头文件,相当于在多个文件中都定义了这个变量,而我们知道在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误)
//a.c
int a = 0;
int b = 0;
void test() {
a = 10;
b = 20;
}
//a.h
#pragma once //防止重复引入
extern int a;
extern int b;
extern void test();
//1.c
#include <stdio.h>
//引入头文件
#include "a.h"
int main() {
test();
a = 100;
system("pause");
}
//2.c
#include <stdio.h>
//引入头文件
#include "a.h"
int haha() {
a = 1009;
system("pause");
}
5.static全局变量
1)static全局变量和普通全局变量的区别就是文件作用域不同,static全局变量只能在定义它的文件中使用,而普通全局变量在所有文件中都能使用,只需要声明即可,这一点和Java全然不同
2)static全局变量不能通过extern关键字引入到别的文件中,extern关键字只用于普通全局变量
3)不同文件只能出现一个普通全局变量定义
4)一个文件只能有一个static全局变量的定义,不同文件间的static全局变量即使变量名相同,也是两个没有关系的变量
5)不能在两个文件中定义两个变量名相同的普通全局变量,会报重复定义的错误,因为在一个文件中定义之后,在另一个文件就可以使用了,所以没必要也不允许那样定义
//这样在两个文件中都定义了a,运行就会报错
//1.c
#include <stdio.h>
int a = 100;
//在1.c中定义一个static变量b
static int b = 10;
//一个文件只能有一个static全局变量的定义
//这样再次定义b,会提示重定义
//static int b = 29;
int main() {
system("pause");
}
//2.c
#include <stdio.h>
//这样在两个文件中都定义了a,运行就会报错
//int a = 200;
int haha() {
//通过extern引入1.c中的static变量b,这是错误的,
//不能这样使用,b只能在1.c中使用
//extern int b;
//b = 20;
system("pause");
}
6.普通函数和static函数的区别
函数和变量的使用原则是一样的,都是作用域上的区别
1)在一个文件中定义了一个函数之后,所有文件都可以使用这个函数(前提是声明之后),不能在另一个文件中定义相同的函数
2)一个文件可以有一个static函数,并且另一个文件可以有完全相同的一个函数的定义,但是这个static函数只能在当前文件使用