CPU 内存条 硬盘 显卡 主板 显示器之间的关系
当你在电脑上观看一部存储在硬盘上的电影时,各个组件之间会进行一系列的交互和协作。下面是一个简化的流程来说明这个过程:
硬盘: 硬盘是电脑的主要数据存储设备,它永久保存了操作系统、应用程序、文件和数据等。当需要读取或写入数据时,硬盘通过主板与电脑的其他组件进行通信。
内存条: 内存条是一个高速的存储区域,使得CPU可以快速访问数据。当电脑需要执行一个任务时,相关的数据首先被加载到内存中,这样CPU就可以快速读取和处理这些数据。
CPU: CPU(中央处理器)是电脑的“大脑”。它执行操作系统、应用程序和用户指令。CPU处理内存中的数据,执行计算和操作,以完成各种任务。
显卡: 显卡负责将CPU处理后的数据转换成图像。显卡内部有一个图形处理单元(GPU),它能快速处理大量的图像数据,并将其发送到显示器进行显示。显卡还负责处理与图形相关的计算任务,如游戏、3D建模等。
主板: 主板是一个电路板,连接和支撑了电脑的所有主要组件。主板上安装了各种插槽、接口和连接器,使得各个组件能够相互通信和协同工作。
显示器: 显示器是最终的输出设备,它显示显卡发送的图像。显示器将图像显示给用户,使得用户可以看到电脑的处理结果。
在电影播放的场景中:
通过这些组件的协同工作,用户可以观看到电影的图像和听到声音。这种协同工作使得电脑成为一个功能强大的工具,可以进行各种任务,如办公、娱乐、游戏、设计等。
在这个过程中,各个组件之间的通信和协同工作是至关重要的。它们共同协作,使得电影能够流畅地播放出来。当然,这只是一个简化的流程,实际的过程可能更加复杂,涉及更多的细节和技术。
#include <stdio.h>
int main(void){
printf("hello world");
return 0;
}
.exe
的可执行文件.exe
文件是由操作系统调用 CPU 去执行的底层硬件的执行涉及到计算机的物理结构和工作原理。当我们编译和执行上面的C代码时,它会在底层硬件上经历一系列的步骤。以下是这些步骤的简化概述:
printf
函数,这涉及到CPU执行相应的指令来控制计算机的I/O操作,即将文本输出到显示器或控制台。
printf
函数,它通常涉及到与操作系统的底层交互,以将输出发送到显示器或控制台。就像数学上对数字进行分类(整数、分数、有理数、无理数……)一样,C语言也将变量进行不同的分类。
int i =1
表示 i 变量是整型变量,所谓整型变量就是只能存放整数的变量
结构体、枚举,后面会讲
共用体,已经被淘汰掉了
变量的本质:内存中的一端存储空间
变量,可以理解为存储数据的容器
变量的定义就是向内存申请一块空间(容器)作为变量,并将变量名作为这块空间的名字
变量的初始化就是对变量进行赋值
int i;i=1
等价于 int i=3;
对下面的代码进行讨论和学习:
这里主要看** **
**int i**
和**i=1**
,**printf**
的用法后面详细讲解
**int i;i=1;**
在内存中找了一块空间,将这块空间命名为** i,然后在这个叫做 i **的空间里放上了数据 3。程序运行结束,3 所占的空间会被释放掉。“释放”指的是,这块空间的使用权限被放掉了,被转交给其他程序使用
为什么要使用变量?
如果不使用变量,就必须程序员自己去找内存里的空闲单元。内存里面有很多存储单元,每个存储单元都有一个编号。如果要定义 1000 个变量,把这 1000 个编号都记住几乎是不可能的。
所谓初始化,就是赋值的意思
#include <stdio.h>
int main(void){
int i;
//i=1;
printf("i=%d\n",i);
return 0;
}
这段代码,没有对变量进行初始化就将其输出
这样,其输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值
注意:虽然理论上i的初始值是不确定的,但实际上在许多编译器和平台上,会被初始化为0。这就是为什么你每次运行结果都得到0的原因。
软件运行与内存的关系(垃圾数据)
内存是在操作系统的统一管理下使用的!
综上所述,一个软件所分配到的空间极有可能存在着其他软件使用过后的残留数据,这些数据就被称为“垃圾数据”。
那么,为什么 [ 输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值 ] 呢?
以下内容目前较难理解,暂时先放在这里:
这个变量没有被初始化赋值,变量里也没有之前程序遗留的数据,那么硬要输出,会输出什么?
在这种情况下,如果变量没有被初始化赋值,且没有之前程序遗留的数据,那么输出的结果将是未定义的。由于局部变量的初始值是不确定的,所以在这种情况下,你无法预测程序将输出什么结果。在C语言中,未初始化的局部变量具有未定义的值,这意味着它们的值是不确定的。因此,如果你尝试输出一个未赋值的局部变量的值,结果将是不可预测的,每次运行都可能得到不同的值。为了避免这种情况,你应该始终给变量赋一个初始值或在使用之前给它赋值。
没有被初始化赋值,变量里也没有之前程序遗留的数据,为什么还会输出一个值?这个不确定的值是哪里来的?
这个不确定的值是由于局部变量的内存分配和初始化机制导致的。在C语言中,当程序运行时,栈内存用于存储局部变量和函数调用的信息。每个局部变量都有其自己的内存地址,但是它们的初始值是不确定的,取决于它们所在内存位置上之前的数据。
即使变量之前没有遗留数据,由于栈内存的特性,该变量所在的内存地址可能包含之前其他变量的值或者垃圾数据。当程序试图读取这个未初始化的变量时,它将输出这个内存地址上的值,即之前存储在那里的数据。
因此,即使变量没有被显式初始化赋值,也可能会有一些不确定的值,因为它的初始值取决于它所在内存位置上之前的数据。为了避免这种情况,程序员应该始终给变量赋一个初始值或在使用之前给它赋值。这样可以确保变量的值在我们使用它之前是已知的,并且不会输出不确定的值。
局部变量吗?全局变量会如何?
对于全局变量,情况会有所不同。全局变量是在程序的全局范围内定义的,它们在程序的整个生命周期中都存在。因此,全局变量的初始值通常取决于它们在内存中的位置和系统的默认初始化值。
在许多情况下,全局变量的初始值会被设置为0或空指针,但这并不是C语言强制要求的。实际上,全局变量的初始值是不确定的,取决于它们所在内存位置上之前的数据。
与局部变量不同的是,全局变量在程序开始执行时就被分配内存,并且在程序结束时才被释放。因此,全局变量的值在整个程序运行期间都保持不变,除非程序员显式地修改它们的值。
总之,无论是局部变量还是全局变量,都应该在使用之前进行初始化赋值,以确保它们的值在我们使用它们时是已知的,避免输出不确定的值。