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

为什么要学习 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语言强制要求的。实际上,全局变量的初始值是不确定的,取决于它们所在内存位置上之前的数据。
与局部变量不同的是,全局变量在程序开始执行时就被分配内存,并且在程序结束时才被释放。因此,全局变量的值在整个程序运行期间都保持不变,除非程序员显式地修改它们的值。
总之,无论是局部变量还是全局变量,都应该在使用之前进行初始化赋值,以确保它们的值在我们使用它们时是已知的,避免输出不确定的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 ChatGPT 上使用 Wolfram 插件回答数学问题

这里写自定义目录标题 写在最前面Wolfram是什么&#xff1f;ChatGPT 如何与 Wolfram 相结合&#xff0c;为什么有效&#xff1f;如何在 ChatGPT 上安装 Wolfram 插件&#xff1f; 写在最前面 参考&#xff1a;https://clickthis.blog/zh-CN/how-to-answer-math-questions-usin…

大一C语言查缺补漏 12.28

在C语言中&#xff0c;5%&#xff08;-3&#xff09;答案是什么 在C语言中&#xff0c;5 % -3的结果是2。因为在C语言中&#xff0c;取余运算&#xff08;%&#xff09;的结果的符号与被除数相同。所以&#xff0c;5 % -3的计算结果为2。 在C语言种引用数组元素时&#xff0c;其…

css、js、vue常考部分面试题

css css盒子水平垂直居中方法 方法一&#xff1a;定位 .child{height: 100px;position: absolute;//父元素相对定位top:50%;left:50%;transform: translate(-50%,-50%); } 方法二&#xff1a;定位 .child{width: 100px;height: 100px;position: absolute;top:50%;left:50%…

OVF简介(Open Virtualization Format:开放虚拟化格式 )

OVF&#xff08;Open Virtualization Format&#xff1a;开放虚拟化格式 &#xff09; 开源虚拟化格式OVF&#xff08;Open Virtualization Format&#xff09;文件是一种开源的文件规范&#xff0c;它描述了一个开源、安全、有效、可拓展的便携式虚拟打包以及软件分布格式。 …

Unity 使用Sprite绘制一条自定义图片的线

Unity 使用Sprite绘制一条自定义图片的线 前言项目场景布置代码编写总结 运行效果感谢 前言 遇到一个需要绘制自定义形状的需求。那只能利用Sprite来绘制一条具有自定义图片的线&#xff0c;通过代码动态设置起点、终点以及线宽&#xff0c;实现灵活的线条效果。 项目 场景…

c++属于同一个类的不同对象之间可相互访问private和protected成员

先看一个代码例子&#xff1a; #include <stdio.h>class A { private:char* name;void printA_Name() const {printf(name);} public:A(char* name) {this->name name;}void printA_Name(const A& a) {printf(a.name);}void printA_Name2(const A& a) {a.pr…

【Linux Shell】6. echo 命令

文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式&#xff1a; echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …

arr.prototype 数组的方法

1.forEach 作用:遍历这个数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];arr.forEach((item) > {console.log(item);}); 返回值:没有返回值 2.fiflter 作用:过滤数组 代码&#xff1a; let arr [10, 20, 30, 40, 50];let newArr arr.filter((item) > {retu…

机器学习(三) -- 特征工程(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 一、特征…

全视通-医院智能视讯系统 病房视讯系统解决方案 智能医院对讲系统信息发布系统

医院智能视讯系统解决方案 1、行业背景 对于患者来说现阶段各大医院的住院部大都面临同样的问题&#xff0c;例如患者就医缺乏精准化医疗&#xff0c;缺乏对患者的心理健康引导&#xff0c;缺乏多维度沟通渠道&#xff0c;缺乏多元增值服务等。 对于传统医院住院部病房&am…

JVM篇:字符串常量池

String类型字符串常量池问题 public class demo2 {public static void main(String[] args) {String s1 "a";String s2 "b";String s3 "ab";} } 对以上代码进行编译得到字节码文件后使用javap -c [字节码文件]反汇编得到以下信息 Constant…

自定义标记

章节目录&#xff1a; 一、概述二、使用自定义标记三、注册自定义标记3.1 创建文件3.2 修改文本编码格式 四、执行测试五、结束语 一、概述 pytest 可以支持自定义标记&#xff0c;自定义标记可以把一个 web 项目划分多个模块&#xff0c;然后指定模块名称执行。譬如我可以标明…

企业邮箱发送会议邀请:简单高效的邮件安排技巧与指南

通过电子邮件安排会议是工作中的常见做法。这也是确认口头安排的会议的一种有益方式。在本视频中&#xff0c;我们将详细介绍此类电子邮件的基本部分&#xff01; 您可能出于多种原因需要安排会议&#xff0c;例如安排面试、跟进业务主管或与潜在客户探讨项目。通过电子邮件有效…

HarmonyOS4.0系统性深入开发14AbilityStage组件容器

AbilityStage组件容器 AbilityStage是一个Module级别的组件容器&#xff0c;应用的HAP在首次加载时会创建一个AbilityStage实例&#xff0c;可以对该Module进行初始化等操作。 AbilityStage与Module一一对应&#xff0c;即一个Module拥有一个AbilityStage。 DevEco Studio默…

高并发如何保证接口的幂等性?

前言 接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法&#xff0c;绝大部分内容我在项目中实践过的&#xff0c;给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景&#xff1a; 有时我…

Open3D聚类算法

按照官网的例子使用聚类&#xff0c;发现结果是全黑的。 经过多次测试发现 eps3.3, min_points1这里是关键 min_points必须等于1否则无效果 import time import open3d as o3d; import numpy as np; import matplotlib.pyplot as plt#坐标 mesh_coord_frame o3d.geometry.Tria…

css sourcemap 源代码映射

vue.config.js css: {// Enable CSS source maps.sourceMap: process.env.NODE_ENV ! production, }重新运行&#xff1a;yarn serve 效果&#xff1a;

在目标检测中,Anchor的庞大数量使得存在严重的不平衡问题。这里的不平衡指的是什么。

问题描述&#xff1a; 在目标检测中&#xff0c;Anchor的庞大数量使得存在严重的不平衡问题。这里的不平衡指的是什么。 问题解答&#xff1a; 在目标检测任务中&#xff0c;Anchor指的是一组预定义的边界框或候选框&#xff0c;这些框以多个尺度和宽高比例组合而成。Anchor…

【Linux Shell学习笔记】Linux Shell基本流程和基本语法

第一部分&#xff1a;Linux Shell 简介 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…

计算机基础知识——数据的表示概述

目录 1 进制转换 1.1 二进制、十进制和十六进制等常用数制及其相互转换 1.2 十进制和二进制之间转换 1.3 二进制数与八进制数、十六进制数之间的转换 2 码值&#xff1a;原码、反码、补码 2.1 原码 2.2 反码 2.3 补码 3 浮点数表示 3.1 浮点数的运算 1 进制转换 1…