C语言预备知识_hello world_数据类型_变量(入门到入神)

发布时间:2024年01月05日

为什么要学习 C语言

  • 学习 C语言是非常接近底层的一种编程语言
  • C语言是学习其它编程语言第基础,基础不牢,地动山摇
  • 考研会用到 C语言

C语言预备知识

CPU 内存条 硬盘 显卡 主板 显示器之间的关系
当你在电脑上观看一部存储在硬盘上的电影时,各个组件之间会进行一系列的交互和协作。下面是一个简化的流程来说明这个过程:

  1. 数据存储(硬盘):电影文件以数字格式存储在硬盘上。硬盘是一个持久的数据存储设备,可以保存文件,即使电脑关闭也不会丢失。
  2. 数据加载(操作系统):当你通过双击电影文件图标或执行播放命令时,操作系统会接收到这个请求。操作系统会与硬盘进行通信,将电影数据从硬盘加载到内存条中。这一步的目的是让CPU能够快速访问和处理这些数据。
  3. 数据处理(CPU):CPU接收到从内存条中传递过来的电影数据,并开始执行播放指令。CPU会处理这些数据,执行相应的计算和操作,以播放电影。CPU处理的数据可能包括解码视频、处理音频、同步视频和音频等任务。
  4. 图像生成(显卡):显卡接收到CPU处理后的数据,并将其转换成图像。显卡内部有一个图形处理单元(GPU),能够快速处理大量的图像数据。显卡将图像数据发送到显示器上显示出来,使得用户可以看到电影的图像部分。
  5. 声音播放(声卡):电影的声音数据也会被处理并播放出来。声卡(通常集成在显卡上)负责处理声音数据,并通过电脑的音响系统播放出来。
  6. 输出显示(显示器):显示器是最终的输出设备,它显示显卡发送的图像。用户通过显示器观看电影的图像和听到声音。

硬盘: 硬盘是电脑的主要数据存储设备,它永久保存了操作系统、应用程序、文件和数据等。当需要读取或写入数据时,硬盘通过主板与电脑的其他组件进行通信。
内存条: 内存条是一个高速的存储区域,使得CPU可以快速访问数据。当电脑需要执行一个任务时,相关的数据首先被加载到内存中,这样CPU就可以快速读取和处理这些数据。
CPU: CPU(中央处理器)是电脑的“大脑”。它执行操作系统、应用程序和用户指令。CPU处理内存中的数据,执行计算和操作,以完成各种任务。
显卡: 显卡负责将CPU处理后的数据转换成图像。显卡内部有一个图形处理单元(GPU),它能快速处理大量的图像数据,并将其发送到显示器进行显示。显卡还负责处理与图形相关的计算任务,如游戏、3D建模等。
主板: 主板是一个电路板,连接和支撑了电脑的所有主要组件。主板上安装了各种插槽、接口和连接器,使得各个组件能够相互通信和协同工作。
显示器: 显示器是最终的输出设备,它显示显卡发送的图像。显示器将图像显示给用户,使得用户可以看到电脑的处理结果。

在电影播放的场景中:

  • 电影文件首先储存在硬盘上。
  • 当用户双击电影文件时,操作系统将电影数据从硬盘加载到内存条中。
  • CPU开始处理这些数据,执行播放指令。
  • 显卡接收到CPU的处理结果,将数据转换成图像,并通过显示器显示出来。
  • 声音数据则通过声卡(集成在显卡上)播放出来。

通过这些组件的协同工作,用户可以观看到电影的图像和听到声音。这种协同工作使得电脑成为一个功能强大的工具,可以进行各种任务,如办公、娱乐、游戏、设计等。
在这个过程中,各个组件之间的通信和协同工作是至关重要的。它们共同协作,使得电影能够流畅地播放出来。当然,这只是一个简化的流程,实际的过程可能更加复杂,涉及更多的细节和技术。

hello world 是如何被运行的

#include <stdio.h>

int main(void){
	printf("hello world");
	return 0;
}

image.png

  • 写好代码后,通过编译和链接,会生成一个后缀为 .exe的可执行文件
  • 执行这个 .exe文件是由操作系统调用 CPU 去执行的

底层硬件的执行涉及到计算机的物理结构和工作原理。当我们编译和执行上面的C代码时,它会在底层硬件上经历一系列的步骤。以下是这些步骤的简化概述:

  1. 编译过程:
  • 预处理:编译器首先会解析预处理器指令。在此代码中没有使用到预处理器指令,所以这个步骤比较简单。
  • 编译:编译器将C代码转换为汇编代码。
  • 汇编:汇编器将汇编代码转换为机器语言代码。
  1. 链接过程:链接器将编译得到的多个目标文件组合在一起,形成一个可执行文件。在这个简单的例子中,只有一个目标文件,所以链接过程相对简单。
  2. 执行过程
  • 加载:操作系统将可执行文件加载到内存中。
  • CPU执行:CPU开始执行内存中的机器语言指令。对于printf函数,这涉及到CPU执行相应的指令来控制计算机的I/O操作,即将文本输出到显示器或控制台。
    • CPU执行指令时,需要与内存、硬盘、显卡等其他硬件设备进行通信,读取和写入数据。
    • 对于printf函数,它通常涉及到与操作系统的底层交互,以将输出发送到显示器或控制台。
  1. 返回:程序执行完毕后,返回0表示程序正常结束。

数据类型

就像数学上对数字进行分类(整数、分数、有理数、无理数……)一样,C语言也将变量进行不同的分类。
int i =1表示 i 变量是整型变量,所谓整型变量就是只能存放整数的变量

基本数据类型

  • 整数
    • 整型–int(一般 4 个字节)
    • 短整型–short int(一般 2 个字节)
    • 长整型–long int(一般 8 个字节)
  • 浮点数
    • 单精度浮点数 float(一般 4 个字节)
    • 双精度浮点数 double(一般 8 个字节)
  • 字符
    • char(1 个字节) --C语言里面没有一个数据类型可以存储一个字符串,char 是存储单个字符的数据类型

复合数据类型

  • 结构体
  • 枚举
  • 共用体

结构体、枚举,后面会讲
共用体,已经被淘汰掉了

变量

什么是变量

变量的本质:内存中的一端存储空间
变量,可以理解为存储数据的容器
变量的定义就是向内存申请一块空间(容器)作为变量,并将变量名作为这块空间的名字
变量的初始化就是对变量进行赋值
image.png
int i;i=1等价于 int i=3;
对下面的代码进行讨论和学习:
image.png

这里主要看** ****int i****i=1**,**printf**的用法后面详细讲解

  • **int i;i=1;**在内存中找了一块空间,将这块空间命名为** i,然后在这个叫做 i **的空间里放上了数据 3。程序运行结束,3 所占的空间会被释放掉。

“释放”指的是,这块空间的使用权限被放掉了,被转交给其他程序使用

image.png
为什么要使用变量?
如果不使用变量,就必须程序员自己去找内存里的空闲单元。内存里面有很多存储单元,每个存储单元都有一个编号。如果要定义 1000 个变量,把这 1000 个编号都记住几乎是不可能的。

为什么变量必须初始化

所谓初始化,就是赋值的意思

#include <stdio.h>

int main(void){
	int i;
	//i=1;
	printf("i=%d\n",i);
	return 0;
}

这段代码,没有对变量进行初始化就将其输出

这样,其输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值

注意:虽然理论上i的初始值是不确定的,但实际上在许多编译器和平台上,会被初始化为0。这就是为什么你每次运行结果都得到0的原因。

软件运行与内存的关系(垃圾数据)
内存是在操作系统的统一管理下使用的!

  1. 软件在运行前需要向操作系统申请存储空间,在内存空间足够的时候,操作系统将分配一端内存空间并将外存中软件复制一份存入到该内存空间中,并启动该软件的运行。
  2. 在软件与运行期间,该软件所占用的内存空间并不在分配给其他软件。
  3. 当软件运行完毕后,操作系统将回收该内存空间(注意:操作系统并不清空该内存空间中遗留的数据,而是释放掉该内存空间的使用权),以便再次分配给其他软件使用。

综上所述,一个软件所分配到的空间极有可能存在着其他软件使用过后的残留数据,这些数据就被称为“垃圾数据”。

那么,为什么 [ 输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值 ] 呢?
image.png
以下内容目前较难理解,暂时先放在这里:
这个变量没有被初始化赋值,变量里也没有之前程序遗留的数据,那么硬要输出,会输出什么?

在这种情况下,如果变量没有被初始化赋值,且没有之前程序遗留的数据,那么输出的结果将是未定义的。由于局部变量的初始值是不确定的,所以在这种情况下,你无法预测程序将输出什么结果。在C语言中,未初始化的局部变量具有未定义的值,这意味着它们的值是不确定的。因此,如果你尝试输出一个未赋值的局部变量的值,结果将是不可预测的,每次运行都可能得到不同的值。为了避免这种情况,你应该始终给变量赋一个初始值或在使用之前给它赋值。

没有被初始化赋值,变量里也没有之前程序遗留的数据,为什么还会输出一个值?这个不确定的值是哪里来的?

这个不确定的值是由于局部变量的内存分配和初始化机制导致的。在C语言中,当程序运行时,栈内存用于存储局部变量和函数调用的信息。每个局部变量都有其自己的内存地址,但是它们的初始值是不确定的,取决于它们所在内存位置上之前的数据。
即使变量之前没有遗留数据,由于栈内存的特性,该变量所在的内存地址可能包含之前其他变量的值或者垃圾数据。当程序试图读取这个未初始化的变量时,它将输出这个内存地址上的值,即之前存储在那里的数据。
因此,即使变量没有被显式初始化赋值,也可能会有一些不确定的值,因为它的初始值取决于它所在内存位置上之前的数据。为了避免这种情况,程序员应该始终给变量赋一个初始值或在使用之前给它赋值。这样可以确保变量的值在我们使用它之前是已知的,并且不会输出不确定的值。

局部变量吗?全局变量会如何?

对于全局变量,情况会有所不同。全局变量是在程序的全局范围内定义的,它们在程序的整个生命周期中都存在。因此,全局变量的初始值通常取决于它们在内存中的位置和系统的默认初始化值。
在许多情况下,全局变量的初始值会被设置为0或空指针,但这并不是C语言强制要求的。实际上,全局变量的初始值是不确定的,取决于它们所在内存位置上之前的数据。
与局部变量不同的是,全局变量在程序开始执行时就被分配内存,并且在程序结束时才被释放。因此,全局变量的值在整个程序运行期间都保持不变,除非程序员显式地修改它们的值。
总之,无论是局部变量还是全局变量,都应该在使用之前进行初始化赋值,以确保它们的值在我们使用它们时是已知的,避免输出不确定的值。

文章来源:https://blog.csdn.net/2301_82018821/article/details/135418264
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。