learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)

news2024/12/27 13:56:42

目录

C程序补充知识

变量的声明和定义

1.什么是变量? 

2.变量的本质是什么? -  所有的变量都要在内存的某个位置开辟空间

3.变量的定义和声明形式、初始化和赋值的区别

4.为什么要定义变量

声明和定义的区别


C程序补充知识

        先让我们来看一段C语言的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main()
{
	printf("hello world!\n");
	system("pause");
	return 0;
}

相信我们有过C语言基础的人第一次写的代码都是hello world,本程序也是非常的简单,运行结果就是在终端上输出一句hello world,但是我们有没有真正理解到这段代码后面的知识呢?它是如何运行的,运行的时候加载到电脑的哪一个部分呢?接下来,让我们一探究竟。

        这段程序在我们看来首先它是一段文本形式的代码,当我们在集成开发环境中运行它的时候,它就形成了一个可执行的二进制文件,也就是一个可执行的程序。我们可以发现,我们在创建代码的文件中有一个Debug文件,点进去我们会发现有一个应用程序.exe(如下图),这就是我们的可执行程序。它就类似于我们的QQ、微信,双击就可以运行。

 我们所有都知道,应用需要双击才可以打开,但是我们有没有思考过,为什么我们的程序要双击呢?

应用程序双击是一种用户与计算机之间的交互方式,本质上是一种操作系统的功能。当用户双击应用程序图标时,操作系统会寻找该程序的可执行文件,然后执行该文件,将程序加载到内存中,并开始运行。 

从而我们可以得出:任何程序在执行前都必须加载到内存当中

这里我提出两个问题:

        1.程序没有加载到内存之前,存放在什么位置? -  硬盘

程序在没有被加载到内存中之前,通常是存储在计算机的硬盘或其他存储介质上的。具体来说,程序文件通常被存储为二进制文件或者可执行文件的形式,包含了编译后的代码和数据等信息。

当用户运行程序时,操作系统会从硬盘或其他存储介质中找到该程序文件,并将其加载到内存中,然后将CPU的指针设置为该程序的入口点,使其开始执行。在程序运行期间,CPU会不断地从内存中读取指令和数据,对其进行处理,然后将结果写回内存。

需要注意的是,操作系统并不是直接将整个程序文件加载到内存中,而是进行了分段加载,将程序分成了多个段(例如代码段、数据段、堆栈段等),然后逐个将这些段加载到内存中。这样可以提高内存的利用率,并且使得程序可以更加灵活地使用内存。

        2.为什么程序一定要加载到内存当中呢? -  访问速度快

在计算机执行程序时,需要将程序代码和数据加载到内存中,然后才能让计算机执行这些程序操作。这是因为内存具有比硬盘更快的读取速度,因此将程序加载到内存中可以使计算机更快地执行程序。

另外,程序在运行时需要不断地访问和修改存储在内存中的数据,如果程序没有被加载到内存中,它无法进行这些操作。

因此,将程序加载到内存中是程序能够在计算机上运行的必要前提。 当程序被加载到内存中时,操作系统会为该程序分配一定的内存空间,以及为程序所需的所有库文件和系统资源分配内存空间,以确保程序在运行时可以访问到这些资源。当程序运行结束后,操作系统会释放这些内存空间,以便其他程序使用。

这里需要我们理解一下冯诺依曼体系,先来看一张图片

输入设备:是指用于将外部数据输入到计算机系统中的各种设备。常见的输入设备包括:鼠标、键盘、触摸屏、扫描仪、数码相机、麦克风、手写板等。这些设备可以将不同形式的数据输入到计算机中,如文本、图像、音频、视频等。

存储器:是计算机系统中用于存储数据和指令的硬件设备。它可以分为两种类型:主存储器(也称为随机存取存储器或RAM)和辅助存储器(也称为二级存储器或外存储器)。

主存储器通常是计算机系统中最重要的一种存储器,用于存储当前正在执行的程序和数据。它是由一组芯片组成的,可随时访问其中的任何位置。主存储器的容量通常以字节为单位计算,并以兆字节(MB)或吉字节(GB)为单位表示。

辅助存储器通常是计算机系统中可移动的存储设备,例如硬盘、光盘、U盘、磁带等。它们通常比主存储器容量更大,但使用速度会相对较慢。辅助存储器的数据可以在需要时读取到主存储器中进行处理。

运算器:是计算机的主要组成部分之一,也称为算术逻辑单元(ALU)。它是一种专门用于执行算术和逻辑操作的硬件设备。运算器通常包括多个算术逻辑单元(ALU),用于执行各种算术运算,例如加、减、乘、除等,以及逻辑运算,例如与、或、非、异或等。

控制器:是计算机的一个重要组成部分,它是一个电子电路,负责协调计算机内部各部分的运作,以及控制计算机的操作和处理过程。

控制器主要包括两部分:指令寄存器指令译码器。指令寄存器用于存储CPU当前正在执行的指令,指令译码器则用于解析指令并将其转换成CPU可以执行的操作码。当CPU需要执行一条指令时,它会从主存储器中读取该指令,并将其存储到指令寄存器中。然后,指令译码器会解析该指令,将其转换成一系列操作码,并向各个部件发出控制信号,协调各部件的运作,以完成指令的执行过程。除此之外,控制器还负责处理各种中断信号,例如外部设备的输入输出请求、硬件故障等,以保证计算机的稳定运行。

输出设备:是计算机系统用于向用户显示计算结果、输出信息和数据的设备,它可以将计算机处理过的数据和结果进行可视化或声音化等形式输出。 常见的输出设备包括:  显示器 、打印机、 喇叭或扬声器 、投影仪等

        当我们从输入设备(键盘)输入数据时,然后编写好代码,将代码文件经过编译器编译后会生成可执行文件,数据首先会被放入到存储器(硬盘),当我们双击可执行文件时,操作系统会将该文件加载到内存中。加载时,操作系统会分配一段内存空间给程序,为代码文件分配虚拟内存地址,当CPU执行程序时,它会从内存中读取程序代码和数据,并在CPU内部执行指令。CPU执行指令时,它会将结果存储在内存中,也可将结果输出到显示器、打印机等输出设备上。  当程序执行完毕后,操作系统会释放分配给程序的内存空间,并将程序从内存中卸载。这就是我们hello world的整个程序执行过程啦!

变量的声明和定义

这里依然提出几个问题:

1.什么是变量? 

在计算机编程中,变量是指一个名称代表的内存位置,用于存储程序运行时需要的数据。变量可以存储各种类型的数据,例如数字、字符串、布尔值等。

变量的名称由程序员定义,并根据需要指定变量的数据类型。变量的数据类型决定了变量可以存储的数据类型和占用的内存空间大小。

例如,整数类型的变量可以存储整数值,而字符串类型的变量可以存储字符串值。

在程序运行过程中,程序可以不断地给变量赋值,并将变量的值用于计算、比较或其他操作。变量的值可以改变,但其内存位置不变。

因此,程序可以通过变量来存储和访问各种数据,并通过数据的改变来实现程序的逻辑。 总之,变量是用于存储程序运行时需要的数据的一种机制,可以存储各种类型的数据,并通过其名称和数据类型来在程序中访问和操作数据

2.变量的本质是什么? -  所有的变量都要在内存的某个位置开辟空间

在计算机内部,变量本质上是一段内存空间用来存储数据。 通过变量,我们可以给这段内存空间一个名称,方便我们在程序中引用和修改这段内存中的数据。 

3.变量的定义和声明形式、初始化和赋值的区别

类型 变量名 = 默认值; -   定义

类型 变量名; -   声明

int a;//声明

double d = 20.0;//定义

char c = 'c';//初始化

c = 'a';//赋值

变量初始化是指在定义一个变量时,为它赋予一个初始值。在大多数编程语言中,变量的初始值默认是一些特定的值,例如数值变量的初始值为0,布尔型变量的初始值为false。如果在定义变量时明确赋予了一个初始值,则我们称之为变量初始化。

变量赋值是指在程序执行过程中,为一个已经存在的变量重新赋值。我们可以将一个新的值赋予一个变量,也可以将一个变量的值赋予另一个变量,从而更新这个变量的值。

总的来说,变量初始化是在定义变量时为其赋予一个初始值,而变量赋值是在程序执行过程中更改一个已经存在的变量的值。

4.为什么要定义变量

定义变量的主要目的是为了在程序中存储和处理数据。在许多计算机程序中,我们需要存储和操作各种类型的数据,例如数字、字符串、布尔值等等。如果没有变量,我们就无法在程序中存储和引用这些数据。

通过定义变量,我们可以在程序中给这些数据赋予一个名称或者标识符。这个标识符可以表示一个具体的值,而且这个值可以被程序随时更新和修改。这样,我们可以在程序中灵活地使用这些数据,根据不同的情况来更新和处理数据。同时,使用变量还能提高程序的可读性和可维护性,让代码更加易于理解和修改。

定义变量还可以用来节约内存空间。当我们需要使用一些较大的数据时,可以创建一个变量来存储这些数据,而不是一直重新创建。这样可以减少内存的开销,让程序更加高效。而且在程序中的数据并不是目前需要使用,因此我们需要变量去存储它。

程序运行:需要加载到内存当中

程序计算:需要使用变量

定义变量的本质:为数据在内存中分配一段存储空间,通过这个存储空间的地址来访问和修改数据。

声明和定义的区别

定义和声明是编程中两个重要的概念,它们有一些相似之处,但也有不同。

声明通常是指在代码中告诉编译器某个变量、函数等的存在和基本信息,而不进行具体实现。在声明时,我们只需要指定变量的类型和名称即可,不需要为其分配内存空间或者进行其他操作。

举个例子,如果我们要在C语言中使用一个名为x的整型变量,我们可以这样声明它:

```int x;```

在这个声明中,我们只是告诉编译器x是一个整型变量,在后续的代码中会用到它。但是这个声明并没有分配内存空间或者进行其他操作,因此x的具体值是未知的。

定义则是指在代码中为变量或者函数等分配内存空间,并且进行相应的初始化或者实现。在定义时,我们需要为变量分配内存空间,为其赋予初始值或者进行其他操作。

回到上面的例子,我们如果需要定义这个变量,就需要在声明的基础上进行具体实现:

```int x = 0;```

在这个定义中,我们为x分配了一个整型的内存空间,并将其初始值设为0。这样,在后续的代码中,我们就可以使用这个变量并对它进行操作了。

总的来说,声明和定义都是为了告诉编译器程序中的某个变量或者函数的存在和基本信息,但声明不会分配内存空间或者进行其他操作,而定义会在声明的基础上进行具体实现,分配内存空间,并进行初始化或者实现。

这里我们用个小故事来讲解其区别

        寝室的四个人都喜欢一个名叫小花的女同学,寝室里面有一个人最大胆,率先向小花说做我女朋友,小花也说了我愿意。为了防止寝室其他人再去向小花表白,此时你肯定就会跑到寝室说小花已经是我女朋友啦,你们要保持好距离,寝室其余人听完都默默的伤心起来。

在这个故事里:表白小花就是定义,只能定义一次,

                        向舍友告知就是声明,声明可以有多次。

哈哈,本期博客分享结束啦。

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

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

相关文章

史上最严宝宝口粮新国标出台,DHA和维生素D可能无需额外补充了

自2023年2月22日起&#xff0c;我国婴幼儿配方食品&#xff08;以下简称配方奶&#xff09;新国标开始实施。这意味着2023年2月22日以后在中国上架销售的配方奶必须符合新国标&#xff0c;重新取得国家市场监督管理总局食品评审中心&#xff08;CFE-SAMR&#xff09;的注册。这…

【单片机】基于Arduino cli和VS Code配置开发环境,彻底抛弃Arduino IDE

文章目录 0 前言1 VS Code的优势和Arduino IDE的劣势2 前期准备3 Arduino cli3.1 Arduino cli是什么3.2 下载与安装3.3 基本使用3.4 开发环境配置 4 VS Code配置5 参考链接 0 前言 之前有在电脑上基于VS Code配置Arduino环境&#xff0c;大致方法就是在安装Arduino IDE的前提下…

SCT2650STER,可以实现低成本升降压

市面上主流的中高压升降压拓扑方案有四开关管升降压控制芯片、SEPIC/反激控制芯片等。实际上四开关管升降压芯片成本很高&#xff0c;而SEPIC/反激控制芯片设计复杂。 如果仅需要升降压功能&#xff0c;功率较小&#xff0c;不需要隔离时&#xff0c;本篇解决方案将以SCT2650为…

真题详解(地址索引)-软件设计(五十一)

真题详解&#xff08;单元测试&#xff09;-软件设计&#xff08;五十)https://blog.csdn.net/ke1ying/article/details/130189173?spm1001.2014.3001.5501 指令寻址方式 有四种&#xff0c;直接寻址&#xff0c;寄存器寻址&#xff0c;隐含寻址&#xff0c;立即寻址。 按寻…

基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

【2SFCA的基本思路,可以略过】 对每个供给点j,搜索所有在j搜寻半径(d0)范围内的需求点(k),计算供需比Rj;对每个需求点i,搜索所有在i搜寻半径(d0)范围内的供给点(j),将所有的供需比Rj加总得到i点的可达性Ai。 【数据】 成都市城区绿地数据、各街道小区数据、路网…

基于Rush.js的Monorepo实战

基于Rush.js的Monorepo入门实战 概述 Monorepo是一种软件开发模式&#xff0c;它将多个项目或组件存储在同一个代码库中&#xff0c;而不是将它们分散到多个库中。这样做可以方便跨项目的代码重用、版本控制、依赖管理等&#xff0c;被广泛应用于大型软件公司的开发流程中。 …

动力节点Vue3笔记——Vue程序初体验

目录 一、Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 一、Vue程序初体验 可以先不去了解Vue框架的发展历史、Vue框架有什么特点、Vue是谁开发的&#xff0c;对我们编写Vue程序起不到太大的作用&#xff0c;…

C语言从入门到精通第4天(1~3天的扩展)

1~3天的扩展 拓展数据类型sizeof关键字整型数据的打印格式字符类型的输出格式ASCII码表转义字符进制 拓展数据类型 在开发过程中我们需要处理各种类型的数据&#xff0c;C语言处理基本类型还有其他的类型&#xff1a; sizeof关键字 C语言中可以通过sizeof关键字获取某个数据…

Java源码(三)SpringBoot Web容器应用上下文

思维导图 本文主要分析ServletWebServerApplicationContext源码 SpringBoot Web容器应用上下文&#xff08;这是个人的翻译, 如有不足之处还望指出, 大佬勿喷!!!&#xff09; 1.自我思考及复盘 备注&#xff1a; 自我思考及复盘是为了养成带着问题阅读源码及阅读完源码后总结…

echarts 雷达图

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、雷达图二、环形图三…

27 个Python数据科学库实战案例 (附代码)

为了大家能够对人工智能常用的 Python 库有一个初步的了解&#xff0c;以选择能够满足自己需求的库进行学习&#xff0c;对目前较为常见的人工智能库进行简要全面的介绍。 1、Numpy NumPy(Numerical Python)是 Python的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算…

US News退榜风波后,发布最新美国最佳法学院和医学院排名

从2022年11月开始&#xff0c;美国权威排名机构US News不断陷入风波。耶鲁大学法学院率先宣布退出US News法学院排名&#xff0c;先是法学院&#xff0c;后是医学院&#xff0c;包括哈佛大学大学、斯坦福大学、哥伦比亚大学和加州大学伯克利分校等名校也纷纷宣布退出。 这些老…

【C语言】const关键字的作用

文章目录 一. const修饰变量二. const修饰指针三. const修饰函数参数 一. const修饰变量 被 const 修饰的变量具有常属性&#xff0c;这里的常属性指的是变量的值不能被修改 int main() {// const可以写在类型之前&#xff0c;也可以写在类型之后int const a 10;a 20;// er…

【操作系统——内存的基本知识,逻辑地址到物理地址的转换,操作系统对内存空间的分配和回收以及扩充和保护】

文章目录 内存的基本知识什么是内存&#xff1f;内存有什么作用&#xff1f;进程运行的基本原理知识回顾 内存的管理概念内存空间的扩充内存空间的分配与回收连续分配管理方式动态分区的算法&#xff1a; 内存的基本知识 什么是内存&#xff1f;内存有什么作用&#xff1f; 内…

Linux日志分析

日志的分类 内核以及系统日志 内核及系统日志由系统服务 rsyslog 统一管理&#xff0c;主配置文件为/etc/rsyslog.conf&#xff0c;主程序/sbin/rsyslogd Linux 操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下。 系统日志基于rsyslog服务&#xf…

【LeetCode】剑指 Offer 63. 股票的最大利润 p304 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/ 1. 题目介绍&#xff08;63. 股票的最大利润&#xff09; 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 【测试用…

自然语言处理 —— 02 基于规则的词法分析

一、什么是词法分析? 词:是自然语言中能够独立运用的最小单位,是语言信息处理的基本单位。 词法分析:是词汇层的分析技术。主要包括词的识别、形态分析、词性标注等任务。 1. 词的识别 将句子转换成词序列【就是分词?】 2. 形态分析 词的构成、形态变化、词形还原。 …

物联网定位技术|实验报告|实验三 PDM定位算法

目录 1. 实验目标 2. 实验要求 3. 算法介绍 3.1 PDM算法 4. 算法实现 第一步&#xff1a;将数据读入内存 第二步&#xff1a;判断锚节的个数 第三步&#xff1a;将所有的两点间的距离关系读入距离矩阵 第四步&#xff1a;利用最短路径算法 第五步&#xff1a;构造节点跳数矩…

JVM-0419~20

类的加载 类的加载过程&#xff08;生命周期&#xff09; 类的加载分几步&#xff1f; 按照Java虚拟机规范&#xff0c;从class文件到加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包括如下7个阶段&#xff1a; 基本数据类型在虚拟机里面都预…

【智能座舱系列】-华为发布全球首款车载光场屏 开拓车载视觉体验新航道

4月16日,2023华为智能汽车解决方案“内赋智能,焕发新生”新品发布会在上海举行,华为正式发布全新车载娱乐屏品类:HUAWEI xScene 光场屏。该产品采用独创的光学引擎技术,具有大画幅、景深感、低晕动、眼放松等特点,大幅提升车内视觉体验。 华为光场屏:私人影院装入车内,…