菜鸟转行嵌入式_(第3天)C语言基础_变量

196 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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个字节的如charshortlongint
long longdouble等就不行,为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 变量的数据类型

数据类型可以是基本数据类型,也可以是自定义的数据类型 设计联合体(又叫共用体),结构体等特殊数据类型,详细请见: