一、前言
本文章为我在学习鹏哥的比特C语言的笔记
比特鹏哥C语言视频网址:https://www.bilibili.com/video/BV1Vm4y1r7jY/?p=2&spm_id_from=pageDriver&vd_source=40f80d2efde8eaec4f3c92378e3cb657
二、初识C语言(看懂别人代码,写代码)
三、了解C语言
1.C语言是人和计算机交流的一种工具
详细:**C语言是一门通用计算机编程语言,广泛应用于底层开发。**C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的
C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制
定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、、MSVC、Turbo C等。
2.电脑内部的结构------C语言擅长底层开发
电脑其实是一个硬件,我们会在硬件上装操作系统如:Windows、Linux、Mac来操作硬件。在这两个之间还有驱动层,操作系统调取驱动层,来驱动硬件的工作。我们可以在操作系统上安装应用软件。操作系统之上为上层,操作系统之下为底层(下层)。C语言擅长于底层开发。
拓展:深层次理解硬件层、驱动层、操作系统、应用层
拓展阅读:嵌入式系统是一种能够独立进行运作的器件,其基本组成可以划分为四个主要层次:硬件层、驱动层、操作系统层和应用层。这些层次共同协作,使得嵌入式系统能够执行复杂的任务并适应各种应用环境。
首先,硬件层是嵌入式系统的基石,它包括了系统的所有物理组件,如***微处理器(CPU)、存储器、输入设备、输出设备、接口和总线、电源管理模块以及外围设备和模块等。***这些硬件组件负责执行实际的物理操作,如数据处理、信号转换、通信等。CPU是硬件层的核心,它执行指令并处理数据。存储器则用于存储数据和程序,包括临时存储的RAM和固化程序的ROM。输入设备和输出设备使得系统能够与外界进行交互,接收输入并显示输出。此外,接口和总线用于连接各种设备和模块,确保它们之间的顺畅通信。
驱动层位于硬件层之上,它直接操控硬件并为上层提供服务。**《驱动层由硬件抽象层(HAL)、板级支持包(BSP)和驱动程序组成。》**硬件抽象层将操作系统内核、上层应用程序与硬件进行隔离,提供统一的软件接口,使得上层应用开发无需关心具体的硬件组成。驱动程序则负责初始化设备、在内核和硬件之间传输数据、读取应用程序发送的数据以及检测和处理设备错误等任务。
操作系统层位于驱动层之上,它是嵌入式系统的核心软件部分。**《操作系统负责管理硬件和软件资源,提供任务调度、内存管理、中断处理等功能。它还提供了各种服务和接口,使得应用层能够方便地与底层硬件进行交互。》**操作系统的选择对于嵌入式系统的性能和稳定性至关重要,常见的嵌入式操作系统包括Linux、RTOS等。
最上层是应用层,它包含了用户需要的各种功能和特性。**应用层软件根据具体的应用需求进行开发,**如数字相框的应用层需要支持图像的加载和显示、文件管理、用户交互等功能。应用层与底层硬件之间通过中间件层(包括操作系统和其他中间件如驱动程序、网络协议栈等)实现交互和数据传输。
总的来说,嵌入式系统的这四个层次各自扮演着重要的角色,它们共同构成了一个完整、高效的嵌入式系统。从硬件到应用,每一层都为系统的稳定运行和高效执行提供了必要的支持和保障。
3.C语言的发展历程
计算机语言的发展以及二进制指令的发展如下图所示
我们把助记符命名为ADD
4.C语言的国际标准
背景:C语言早期存在缺陷,不同公司对C语言进行了改造以及升级迭代而导致C语言类型五花八门。我们为了让C语言的统一,制定了C语言的国际标准
C语言的国际标准拓展阅读:https://www.w3cschool.cn/article/91479374.html
拓展: 编译器、编辑器如何辨别
MSVC为VS系列(Visual Studio)的底层编译器
编辑器是用来写代码的,就好比你用word来写小说
编译器是将你写的代码翻译成电脑认识的机器语言
例子:
拓展:由text.c到test.exe的具体路径
从C源代码到可执行文件的四个过程:预处理、编译、汇编、链接
预处理
预处理阶段 预处理器(cpp)根据以#字节开头的命令,修改原始的C程序,预处理器是在真正的编译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏macro是一段重复文字的简短描写)替代。
执行预处理命令:gcc -E hello.c -o hello.i,我们得到由.c文件得到.i文件:hello.i:
编译
编译阶段 编译器(cc1)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
执行编译命令:gcc -S hello.i -o hello.s,我们得到由.i文件得到.s文件:hello.s,这就是汇编文件:
汇编
汇编阶段 汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并保存在hello.o文件中,这是一个二进制文件,无法直接用文本编辑器查看。
执行编译命令:gcc -c hello.s -o hello.o,我们得到由.s文件得到.o文件:hello.o,可重定向文件文件,这个文件就不是文本文件了,因此无法展示。
至此以上三步其实可以由-c参数直接得到可重定向文件:gcc -c hello.c -o hello.o,以上是为了说明预处理和编译两步,专门分步进行,以查看输出。
链接
链接阶段 hello程序调用了printf函数,它来自C标准库,具体存在于一个已经预编译好的printf.o文件,链接器(ld)负责将这个文件与我们的hello文件合并起来。链接(linking)是将各种代码和数据片段收集并组合为一个单一文件的过程,所得到的文件可以被加载(复制)到内存并执行。
执行链接命令gcc hello.o -o hello,我们有.s文件得到可执行文件hello,直接./hello执行即可在命令行打印输出Hellow World。
四、第一个C语言程序
1.配置C语言环境(VS系列)
1.正常打开
2.创建新项目
3.配置新项目
注意:项目名称可以改为:test加上日期(便于记忆)
位置:可以放在D盘的一个便于查找的地方
然后点击创建
创建后可在指定文件夹以及解决方案资源管理器中看到
资源管理器:在上栏的视图中点击打开
2.VS的基础设置
补充:.c 源文件
.h 头文件
操作步骤:右键源文件
上图中还有一个像钉子一样的图样,可以用来固定这个窗口
注意后缀:若为.cpp则 编译器会按照C++的语法来编译代码
若为.c则 编译器会按照C的语法来编译代码
3.写代码以及注意事项
1.int:整型函数
“return 0”中0为整数 (约定俗成) 这两个一一对应
历史遗留习惯:C语言代码正常运行,则返回0
若异常返回或异常终止则返回非0
2.C语言代码中一定要有main函数,它为主函数(规定)
main函数为程序的入口(C语言规定)
main函数有且只有一个(多了会出错)
3.“printf”是一个库函数,专门用来打印数据
4.#include <stdio.h>为包含头文件的意思
目的:使prinf识别
std—标准 i—input o—output
即:包含输入输出的头文件
<stdio.h>为头文件
5.运行代码(fn)+ctrl+F5或点击调试窗口+开始调试
6.//为注释,编译器不会编译//的内容
7.void main()为古老写法,不推荐使用该写法
4.第一个C语言程序代码展现
“”\n“”表示printf打印完之后换行
在C语言中,分号表示语句的结尾,意即一个分号表示着一句具有完整意义的C语句的完结
易错提醒:注意空格、英文状态下的符号书写、“;”“/n”的书写
五、C语言的语法--------数据类型
1.数据类型
1.数据类型种类
数据类型种类繁多可以让空间使用更为灵活
他们的大小不同,表示的范围不同,那么我们在适当的时候选择适当的类型就会更加贴近
浮点型可以这样理解
66.6=6.6610=0.666100
就是这个小数点可以浮动
2.计算出每种类型的大小
*%zu 表示打印一个sizeof的返回的无符号整型(sizeof的返回值由zu来打印)
%d 表示打印整型
代码展现
结果展现
这里的1,2,4,4,8,4,8的单位是字节
double比float精度更高一点
十进制的世界:由0 1 2 3 4 5 6 7 8 9这些数字组成
二进制的世界:由0 1这些数字组成
存储一个二进制的1或0这个空间的大小,我们就称他们为一个比特位
1byte =8bit
1个字节=8个比特位
C语言规定
sizeof(long)≧sizeof(int)
计算机中的单位换算
pb tb gb mb kb byte 之间的换算为1024
例如:两个比特位可以表示4个数
00-----0
01-----1
10-----2
11-----3
3.类型的使用
部分举例
实战-------把20存储起来
原理:运用int 类型创建一个age变量,把20放进去
=向内存申请了int大小的空间,即4个字节的空间把20放进去
五、变量、常量
1.概念
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示
2.定义变量的方法
整型/浮点数+变量名称+(=)赋值;
3.变量的分类
变量分为:局部变量和全局变量
局部变量:{}内部定义的变量
全局变量:{}外部定义的变量
注:在同一个范围内,变量只能出现一次,不能重复定义。
当全局变量和局部变量的名字相同的情况下,局部变量优先。
但是建议不要将全局和局部变量的名字写成一样的。
4.变量的使用------加法运算
例子:写一个代码,计算两个整数的和
第一个代码出错了
使用scanf函数需要在代码第一行写上
#define _CRT_SECURE_NO_WARNINGS
且使用scanf函数需要使用&&
正确代码
#include <stdio.h>为包含头文件的意思
目的:使prinf识别
注意:若不给变量初始化,一个系统会报错,另一个变量为随机值。
3.4常量的作用域和生命周期
3.5常量
4.字符串+转义字符+注释
4.1字符串
4.2转义字符
5.注释
6.选择语句
7.循环语句