1、双击程序时计算机发生了什么
① 在win中双击的在本质是运行程序,将程序加载到内存中
② 任何程序在被运行之前都必须被加载到内存中
两个问题:
①:程序未被加载到内存中放到了哪里?
②:为什么程序要被加载到内存?
①:程序未被加载到内存中放到了硬盘中
②:因为快
2、变量的定义和声明
1、什么是变量
变量是在内存中开辟的特定大小的空间,用来保存数据
关键字:内存
类型名 变量名 ;
2、为什么要定义变量
因为大量数据在CPU处理时并不是一次性全部进行处理,所以一部分数据需要被暂时保存起来,等待后续处理
(变量的定义是在内存中开辟空间,只能开辟一次,而变量的声明使用来告知存在此变量,声明可以多次进行)
3、最宽宏大量的关键字auto
首先需要了解全局变量和局部变量,生命周期,作用域
局部变量:
#include<stdio.h>
int main()
{
int a=0;//a是局部变量
return 0;
}
局部变量只在本代码快中有效,出了本代码块该内存空间被释放
全局变量:
#include<stdio.h>
int a=10;//a 为全局变量,从此处定义起有效,到程序结束
int main()
{
printf("%d",a);
return 0;
}
全局变量在整个程序期间都有效
生命周期:指该变量从定义到被释放的时间范围,(描述存在时间长短)
作用域:该变量影响的范围
注:当全局变量和局部变量名一样时:局部变量优先
auto修饰局部变量,而在编程中auto都省略了,也就是在局部变量之前都被auto修饰
3、最快的关键字register
存储分级
①:离CPU跃进的的存储单元,效率越高,单价成本越贵
②:对于以上任何一种硬件而言,都是冲当上游硬件的缓存
用register修饰尽量将所修饰的变量放在CPU寄存区,从而提高了效率
注意:register修饰的变量不能取地址(因为地址是对于内存而言)
4、最名不副实的关键字static
两个问题:
①:全局变量可以跨文件访问吗?
②:函数可以跨文件访问吗?
由上面三张图可以看见全局变量和函数都可以跨文件访问,但是第四张可以看出函数的还是报了个提醒
那为什么他们没声明却可以跨文件使用?
因为在有一定规模的项目,一定是多文件的,多个文件之间后续一定要进行数据的“交互”,如果不能跨问价,“交互”成本高
那如果用static修饰呢
同样的代码用static修饰全局变量之后就不可以跨文件使用了
因此可以得到结论:①:static修饰全局变量,该变量只在本文件内被访问,不能被外部其他文件直接访问
那static修饰局部变量会发生什么?
#include<stdio.h>
int ex()
{
int i = 0;
int a = 0;
a++;
return a;
}
int main()
{
int p,i;
for (i = 0; i < 10; i++)
{
p = ex();
printf("%d", p);
}
return 0;
}
#include<stdio.h>
int ex()
{
int i = 0;
static int a = 0;
a++;
return a;
}
int main()
{
int p,i;
for (i = 0; i < 10; i++)
{
p = ex();
printf("%d", p);
}
return 0;
}
由上面两段代码可见仅仅加了一个static,运行的结果是完全不同的,当局部变量a的前面加了static时,结果是中10是由a=9,a++得到的,a=9又是由a=8,a++得到的,所以与第一种运行相比较,a的值在函数运行之后不会销毁
由此得出结论:②:static修饰局部变量,更改局部变量的生命周期(但作用域不变:还是在本代码块中,在其他代码块中会显示未定义)