![[C语言深度剖析NO.1]这些你不曾去想的更深层次问题,第1张 [C语言深度剖析NO.1]这些你不曾去想的更深层次问题,第1张](/aiimages/%EF%BC%BBC%E8%AF%AD%E8%A8%80%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90NO.1%EF%BC%BD%E8%BF%99%E4%BA%9B%E4%BD%A0%E4%B8%8D%E6%9B%BE%E5%8E%BB%E6%83%B3%E7%9A%84%E6%9B%B4%E6%B7%B1%E5%B1%82%E6%AC%A1%E9%97%AE%E9%A2%98.png)
💘作者:你我皆为凡人
💘博客主页:你我皆为凡人的博客
💘名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!
💘觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!
💘系列作品:
💘
💘C语言编程刷题篇
💘经典题型系列
文章目录
目录
文章目录
🙈 前言
💫飞雷神之六连问
☯ 1,为什么所有的程序在运行之前都必须被加载到内存当中?
☯ 2,那么在没有被加载到内存的时候,程序在哪里?
☯ 3,什么是变量?
☯ 4,如何定义变量?(怎么用)
☯5,为什么要定义变量?
☯6,定义与声明的本质是什么?
💫飞雷神之最宽宏大量的关键字-----auto
💙关于变量的补充知识:
💜auto详细介绍
💫飞雷神之最快的关键字--register
🙈 总结
🙈 前言
凡人开了新的一系列专栏,C语言深度剖析,更深层次的来剖析C语言,也准备了一系列的问题,大家在看之前想一想,自己对C语言理解的够吗?下面详细介绍了两个关键字已经开头带来的六个小问题
提示:以下是本篇文章正文内容,下面案例可供参考
💫飞雷神之六连问
在win中,双击的本质是运行程序,讲程序加载到内存中,所以任何程序再被运行之前都必须被加载到内存当中
☯ 1,为什么所有的程序在运行之前都必须被加载到内存当中?☯ 2,那么在没有被加载到内存的时候,程序在哪里?答案就是因为快
☯ 3,什么是变量?程序没有被加载的时候,被放到硬盘中
☯ 4,如何定义变量?(怎么用)变量大家都知道,变量本质上是在我们程序运行期间开辟或者有些变量是在编译的时候确定的,上面这些局部变量都是在进入main函数内部开辟空间的,在没有进入之前这些并没有被开辟,所以变量是在程序运行的时候开辟的,而程序没有被运行的时候是被存放在内存中,所以所有的变量,本质上都是要在内存的某个位置上开辟空间的
int main()
{
char c = 'a';//初始化
c = 'd'; //赋值
return 0;
}
☯5,为什么要定义变量?变量如何定义相信大家都不陌生,类型+变量名=默认值
那么初始化和赋值是什么呢?
本质上是在定义的时候,就给c开辟了一块儿空间来存放a,而赋值就是把d直接放到c定义好的空间内部,而不是重新开辟一块儿空间放进去
初始化就好比富二代,一出生就有钱,被初始化定义为a,而赋值就好比一个普通人,通过自己的奋斗去变的有钱,被赋值上有钱人的标志
☯6,定义与声明的本质是什么?为什么要定义变量呢?我有那么大的一块儿空间我直接用就好了啊
计算机呢,是为了解决人的计算问题而诞生的,计算机,看名字就知道是为了进行计算的,计算就需要数据,而你要计算的时候,不是所有的数据都要立马计算的
就好比在吃饭,一桌子饭菜上来你就要全吃掉吗?当然不是,肯定是一口一口的吃,没有吃到的饭菜肯定是先放到碗里或者盘子里,碗或者盘子就好比变量,饭菜就相当于变量立马的数据,需要变量的原因就是因为有的数据需要暂时被保存历来,等待着后续的处理
当然也有人问,如果我想吃菜,我直接拿起来吃不就好了,不放到盘子或者碗里,这样当然可以,但是效率是低的
💫飞雷神之最宽宏大量的关键字-----auto我们已经知道程序运行是需要加载到内存中的,而程序的计算是需要使用变量的,那么定义变量的本质就是在内存中开辟一块空间来保存数据,因为定义变量是程序的一部分,已经被加载到内存当中了
定义是用来开辟空间的,而声明是用来告知的
下面来举一个例子,一个宿舍有八个人,八个人喜欢班里同一个女生,但是你胆子大,你去和女生表白,女生答应了,这个是叫做定义,只能进行一次,而你回宿舍和另外七个人说,这个女生已经是我女朋友了,你们不要去打她的主意了,这个呢,就叫做声明,你告知别人你两的关系,这个是可以多次进行的
相信大家对于局部变量与全局变量已经有了一定的了解
💙关于变量的补充知识:局部变量: 包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动释放。[网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的] 全局变量: 在所有函数外定义的变量,叫做全局变量。全局变量具有全局性。 代码块: 用{}括起来的区域,就叫做代码块 注意:main函数也是函数,也是有代码块的{} 局部变量的作用域只在本代码块儿内有效 全局变量的作用域在整个程序运行期间都有效
生命周期概念: 指的是该变量从定义到被释放的时间范围,所谓的释放,指的是曾经开辟的空间”被释放“ 局部变量的生命周期: 进入代码块,形成局部变量[开辟空间],退出代码块,"释放"局部变量 全局变量的生命周期: 定义完成之后,程序运行的整个生命周期内,该变量一直都有效 例子: 就好比你打王者,开始游戏到结束游戏是一把游戏的生命周期,而你打游戏carry是在这一把游戏里有效果,你的影响只是对这一把游戏有影响,这个就是作用域💜auto详细介绍
一般在代码块中定义的变量,即局部变量默认都是aoto修饰的,不过aoto是一个比较老的关键字,一般省略掉了,如上图,局部变量之前加上auto与不加auto结果都是一样的
默认的所有变量都是auto吗?其实不是,一般是用来修饰局部变量的,如下图:
虽然还会显示结果,但是会报错,auto只能在局部变量前加上
💫飞雷神之最快的关键字--register结论:已经很老,基本永不使用
cpu主要是负责进行计算的硬件单元,为了方便运算,一般需要先把数据从内存取出来到cpu中,所以cpu就需要具有一定的数据临时存储能力,所以在现代cpu内,都集成了一组叫寄存器的硬件用来做临时数据的保存
寄存器的认识
CPU内集成了一组存储硬件即可,这组硬件叫做寄存器
寄存器存在的本质
在硬件层面上是提高计算机的运算效率,因为不需要从内存里读取数据了
register是用来修饰变量的,尽量将所修饰变量,放入到cpu寄存器中,从而达到提高效率的目的
那么什么样的变量可以采用register呢?
1. 局部的(全局会导致CPU寄存器被长时间占用) 2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register的意义在哪呢?) 3. 高频被读取的(提高效率所在) 4. 如果要使用,请不要大量使用,因为寄存器数量有限 注意:register修饰的变量,不能取地址,因为已经放在寄存区中了,而地址是内存相关的概念
🙈 总结对于register关键字,我们一般都不会去用,因为现在的编译器已经很智能了,能够进行比人更好的代码优化,早期需要认为指定register来进行手动优化,而现在已经不需要了
这篇文章讲了更深层次,可能初学者在刚学期间没有太注意的内存上的点,变量大家都知道,但变量背后的问题有没有思考过,关键字大家也明白,用的很多,但是这些背后的原理大家有没有思考过,凡人也会持续更新的,这些都适合初学者的观看,如果哪里写的不好,不对,欢迎大家评论区留言,凡人一定改正,如果觉得凡人写的还不错,希望大家多多支持,感谢大家的观看!!!!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)