本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 变量
变量在程序中用变量名表示。变量名由用户根据其用途任意命名。
变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名。
在程序运行时,变量占据存储空间的大小由其数据类型决定。
变量在内存空间中的首地址,称为变量的地址。
1.1 变量的说明
变量:自己定义出来用于表示特定值的符号
变量在程序中使用时,必须预先说明它们的存储类型和数据类型。
局部变量:在某一个作用域中定义的变量,只能在当前作用域中使用
全局变量:在函数外部定义的变量,全局变量在整个程序运行过程中只会申请一次空间,后面进行访问的时候前面的值仍存在,全局变量如果不进行初始化,它的值为0
变量访问的时候遵循就近原则,同一个作用域中不能重复定义一个变量
变量说明的一般形式是:
定义格式:存储类型 数据类型 变量名 = value;
1.2 变量的存储类型
存储类型是关键词auto(默认为此种模式)、register、const、static、volatile、extern
1.2.1 auto
auto说明的变量只能在某个程序范围内使用(局部变量,有创建和销毁的过程,如在main函数中 int x),通常在函数体内或函数中的复合语句里。(默认是随机值)在函数体的某程序段内说明auto存储类型的变量时可以省略关键字auto,如下:
auto int k ;
int j ;
double x;
eg :
if(1){
int a=10;
printf("%d\n",a); ----->10
}
printf("%d\n",a); ---->error 未定义
1.2.2 register
register寄存器类型:建议性的存储类型,申请不一定成功,不成功相当于auto,是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。
使用频率很高,可以考虑放到寄存器中,但放到寄存器中就不存在取地址这一说法,取地址是指放到内存中,指针是存放地址的,所以register变量也用不了地址,用不了指针
不能用“&”来获取register变量的地址。
register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度
ARM板为32位,只能放4个字节,只能放小于4个字节的如char,short,long,int
long long,double等就不行,为8位
1.2.3 const
const:修饰的变量是一个只读变量
1.2.4 static
static:修饰变量之后限制变量的访问范围,在整个文件当中,优先级高于extern
static变量称为静态存储类型的变量,既可以在函数体内(修饰局部变量),也可在函数体外说明(修饰全局变量)。(默认是0)
static的用法:
1.局部变量:延长了变量的声明周期,在整个程序执行过程中都存在,整个空间只开辟一次,下一次访问还是前次的值
2.全局变量:限制当前变量只能在本文件中使用,别的文件不能引用
static修饰的全部变量,其它文件无法使用
3.函数:只能在本文件中使用
局部变量使用static修饰,有以下特点:
在内存中以固定地址存放的,而不是以堆栈方式存放
只要程序没结束,就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值。
int main()
{
int i=1;
while(i<5){
int a=0;
//static int a;
a++;
printf("a=%d\n",a);
i++;
}
}
----> 1 1 1 1 (auto变量默认是随机值)每次循环都是产生然后销毁,并没有保存住之前的值
//----> 1 2 3 4(static变量默认是0),只要程序没有结束,就不会被销毁,类似于全局变量,延长了变量的生存周期
1.2.5 extern
extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部(全局变量)说明的变量。
想要访问其他文件的全局变量时,用extern申明(格式: extern 数据类型 变量名)且编译的时候需要联合编译;
A 文件中:int global_a=100;
B文件中:extern int global_a;
编译执行: gcc A.c B.c ./a.out
当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。
1.2.6 volatile
volatile:处理高并发使用,限制系统共享资源读取
volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
1.3 变量的数据类型
数据类型可以是基本数据类型,也可以是自定义的数据类型 设计联合体(又叫共用体),结构体等特殊数据类型,详细请见: