定义与声明
什么是变量(是什么)
在内存中开辟特定大小的空间,用于保存数据
本质是在内存的某个位置开辟空间
如何定义变量(怎么用)
类型 变量名 = 默认值(初始值)
int x =10;
char c = 'c';
double d = 3.14;
//三个都属于初始化
c ='b';//赋值(此时空间已经存在在内存中)
为什么要定义变量(为什么)
计算机是为了进行计算的,计算是需要数据的,但是计算中任何一时刻,不是所有的数据都要马上被计算的。换句话说,我们需要数据被暂时保存起来,等待后续处理
变量定义的本质
根据前面的知识,我们知道:
1.程序运行,需要加载到内存中;2.程序计算,需要使用变量
那么,定义变量的本质:在内存中开辟一块空间,用来保存数据 (为什么一定是在内存中:因为定义变量,也是程序运行逻辑的一部分,程序已经被加载到内存中)
变量声明的本质
告知给大家,简单来说就是广而告之
总结
- 定义:开辟空间的,只能有一次
- 声明:告知作用,可以有多次声明
变量的分类,作用域和生命周期
变量的分类
-
局部变量: 包含在代码块中的变量。它具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放
-
全局变量: 在所有函数外定义的变量。它具有全局性
用{ }括起来的区域,就是代码块
#include <stdio.h>
#include <windows.h>
int g_x = 100; //全局变量
int main()
{
int x = 10;//局部变量,main函数也是函数,也有代码块{}
printf("x:%d\n", x);
system("pause");
return 0;
}
变量的作用域
作用域: 指的是该变量可以被正常方面的代码区域(改变量的有效区域) 针对的是影响范围
局部变量的作用域:只在本代码块内有效;全局变量的作用域,整个程序运行期间,都有效。
#include <stdio.h>
#include <windows.h>
int main()
{
int x =10;
if (x == 10)
{
int y= 20;
printf("局部:x: %d, y: %d\n",x,y);//y只能在本代码块内有效
}
printf("局部:x:%d,y: %d\n",x,y);//报错,y不能被访问
system("pause");
return 0;
}
#include <stdio.h>
#include <windows.h>
int g_x = 100;//全局变量
void show()
{
printf("show:全局:%d\n",g_x);//在任何代码块中都可以被访问
}
int main()
{
show();
printf("main: 全局:%d\n",g_x);//在任何代码块中都可以被访问,甚至被修改
system("pause");
return 0;
}
#include <stdio.h>
#include <windows.h>
int g_x= 100;//全局变量
int main()
{
int g_x = 10;//局部变量,与全局同名
printf("g_x:%d\n",g_x);//输出的是局部,也就是局部和全部同名的时候,局部有先 。所以,强烈不建议这样
system("pause");
return 0;
}
变量的生命周期
生命周期: 指的是该变量从定义到被释放的时间范围(什么时候开辟,什么时候释放),所谓的释放,指的是曾曾经被开辟的空间"被释放"。针对的是时间长短
- 局部变量: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量(作用域:局部范围内有效);
- 全局变量: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效(作用域:全程)
作用域 VS 生命周期
auto-最宽宏大量的关键字
- 使用方式:一般在代码块中定义的变量,即局部变量,默认都是auto修饰的,不过一般省略。
- 对象:一般用来修饰局部变量(自动变量,临时变量)
- 作用:修饰局部变量
#include <stdio.h>
#include <windows.h>
int main()
{
for (int i = 0; i < 10; i++)
{
printf("i=%d\n",i);
if(1)
{
auto int j = 0; //自动变量
printf("before: j=%d\n", j);
j += 1;
printf("after : j=%d\n", j);
}
}
system("pause");
return 0;
}
- 结论:基本永不使用
register-最快的关键字
cpu主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到cpu中,那么也就需要cpu具有一定的数据临时存储能力。注意:cpu并不是当前要计算了,才把特定数据读取到cpu里面,那样会特别慢
所以在现代cpu内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。
存储分级(存储金字塔)
距离cpu越近的存储硬件,速度越快,效率越高,单价成本越贵
其实对于任何一种硬件而言,它充当着上游硬件的缓存(类似硬盘中的数据可以在内存中缓存,而内存中的数据可以在cpu中缓存)。cpu访问数据的时候,以最小的成本来达到最高的效率。
寄存器
- 定义:简单来说,就是距离cpu最近的存储硬件 而它就是cpu内集成了一组存储硬件,这个硬件就是寄存器
- 本质:在硬件层面上,提高计算机的运算效率。因为他不再需要从内存读取数据了。
register修饰变量
- 作用:尽量将所修饰的变量,放入cpu寄存器中,从而达到提高效率的目的
- 条件:① 局部的(全局会导致cpu寄存器被长时间占用)② 不会被写入的(赋值)(写入就需要写回内存,如果还有检测的话,register的意义在哪里?) ③ 高频 被读取的( 提高效率所在)④ 如果要使用,请不要大量使用,因为寄存器数量有限
- register修饰的变量,不能取地址(因为已经存在于寄存器中,地址是内存相关的概念)
#include<stdio.h>
#include<windows.h>
int main()
{
register int a=0;
printf("&a=%p\n",&a);
//编译器报错:错误 1 error c2103:寄存器变量上的“&”(寄存器不属于内存范围)
system("pause");
return 0;
}
- 建议:该关键字不用管,也不用使用,因为现在的编译器已经很智能,能够进行比人更好的代码优化。