0、什么是C语言?
- 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、SUBLIME、MSVC、Turbo C等。
- 电脑内部的结构 – C语言擅长底层开发
电脑其实是一个硬件,我们会在硬件上装操作系统如:Windows、Linux、Mac来操作硬件。在这两个之间还有驱动层,操作系统调取驱动层,来驱动硬件的工作。我们可以在操作系统上安装应用软件。操作系统之上为上层,操作系统之下为底层(下层)。C语言擅长于底层开发。
拓展:深层次理解硬件层、驱动层、操作系统、应用层
嵌入式系统是一种能够独立进行运作的器件,其基本组成可以划分为四个主要层次:硬件层、驱动层、操作系统层和应用层。这些层次共同协作,使得嵌入式系统能够执行复杂的任务并适应各种应用环境。
首先,硬件层是嵌入式系统的基石,它包括了系统的所有物理组件,如微处理器(CPU)、存储器、输入设备、输出设备、接口和总线、电源管理模块以及外围设备和模块等。这些硬件组件负责执行实际的物理操作,如数据处理、信号转换、通信等。CPU是硬件层的核心,它执行指令并处理数据。存储器则用于存储数据和程序,包括临时存储的RAM和固化程序的ROM。输入设备和输出设备使得系统能够与外界进行交互,接收输入并显示输出。此外,接口和总线用于连接各种设备和模块,确保它们之间的顺畅通信。
驱动层位于硬件层之上,它直接操控硬件并为上层提供服务。《驱动层由硬件抽象层(HAL)、板级支持包(BSP)和驱动程序组成。》硬件抽象层将操作系统内核、上层应用程序与硬件进行隔离,提供统一的软件接口,使得上层应用开发无需关心具体的硬件组成。驱动程序则负责初始化设备、在内核和硬件之间传输数据、读取应用程序发送的数据以及检测和处理设备错误等任务。
操作系统层位于驱动层之上,它是嵌入式系统的核心软件部分。《操作系统负责管理硬件和软件资源,提供任务调度、内存管理、中断处理等功能。它还提供了各种服务和接口,使得应用层能够方便地与底层硬件进行交互。》操作系统的选择对于嵌入式系统的性能和稳定性至关重要,常见的嵌入式操作系统包括Linux、RTOS等。
最上层是应用层,它包含了用户需要的各种功能和特性。应用层软件根据具体的应用需求进行开发,如数字相框的应用层需要支持图像的加载和显示、文件管理、用户交互等功能。应用层与底层硬件之间通过中间件层(包括操作系统和其他中间件如驱动程序、网络协议栈等)实现交互和数据传输。
总的来说,嵌入式系统的这四个层次各自扮演着重要的角色,它们共同构成了一个完整、高效的嵌入式系统。从硬件到应用,每一层都为系统的稳定运行和高效执行提供了必要的支持和保障。
- C语言的发展历程
计算机语言的发展以及二进制指令的发展如下图所示
我们把助记符命名为ADD
- C语言的国际标准
背景:C语言早期存在缺陷,不同公司对C语言进行了改造以及升级迭代而导致C语言类型五花八门。我们为了让C语言的统一,制定了C语言的国际标准
国际语言标准:ANSIC -C89/90
- C/C++是编译型语言
拓展: 编译器、编辑器如何辨别
MSVC为VS系列(Visual Studio)的底层编译器
编辑器是用来写代码的,就好比你用word来写小说
编译器是将你写的代码翻译成电脑认识的机器语言
- 拓展:由text.c到test.exe的具体路径
从C源代码到可执行文件的四个过程:预处理、编译、汇编、链接
编译器作用:把源代码转换成中间代码,链接器把中间代码和其他代码合并,⽣成可执⾏⽂件。
链接器的作⽤是,把你编写的⽬标代码、系统的标准启动代码和库代码这3部分合并成⼀个⽂件,即可执⾏⽂件。对于库代码,链接器只会把程序中要⽤到的库函数代码提取出来
在⽂件名中,点号(.)前⾯的部分称为基本名(basename),点号后⾯的部分称为扩展名(extension)
- 第一个C语言程序
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> //头文件
int main()
{
printf("hello bit\n");
printf("he he\n");
return 0;
}
main函数是程序的入口
一个工程中main函数有且仅有一个
对于Visual Studio
如果报错scanf:this function may be unsafe.
使用scanf函数需要在代码第一行写上
#define _CRT_SECURE_NO_WARNINGS
且使用scanf函数需要使用&
写代码以及注意事项
1.int:整型函数
“return 0”中0为整数 (约定俗成) 这两个一一对应
历史遗留习惯:C语言代码正常运行,则返回0
若异常返回或异常终止则返回非0
2.C语言代码中一定要有main函数,它为主函数(规定)
main函数为程序的入口(C语言规定)
main函数有且只有一个(多了会出错)
3.“printf”是一个库函数,专门用来打印数据
4.#include 为包含头文件的意思
目的:使prinf识别
std—标准 i—input o—output
即:包含输入输出的头文件
为头文件
5.运行代码(fn)+ctrl+F5或点击调试窗口+开始调试
6.//为注释,编译器不会编译//的内容
7.void main()为古老写法,不推荐使用该写法
1、输入函数
scanf("%d%d", &a, &b); //& - 取地址符号
2、输出函数
printf("%d\n", sum);
%d | 打印十进制有符号数 |
%c | 打印字符 |
%f | 打印浮点型 |
%p | 以地址形式打印 |
%x | 打印16进制数字 |
%s | 打印字符串 |
%zd | 打印内存大小 |
%u | 打印十进制无符号数 |
3、计算机中的单位换算
bit – 比特位 | 只能表示 0 1 |
byte – 字节 | 1byte = 8bit |
kb | 1kb = 1024byte |
mb | 1mb = 1024kb |
gb | 1gb = 1024mb |
tb | 1tb = 1024gb |
pb | 1pd = 1024tb |
4、数据类型
- 数据类型的种类
数据类型种类繁多可以让空间使用更为灵活
他们的大小不同,表示的范围不同,那么我们在适当的时候选择适当的类型就会更加贴近
1、C语言有没有字符串类型?
答案是没有。c语言中没有string类型,string是用char型数组来构造的。
C++ 中 string 模块中有string数据类型
2、long(根据编译器不同,字节也不同,C语言标准规定 sizeof(long) >= sizeof(int) )
- 每种数据类型占据字节大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(short)); // 2
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4
printf("%d\n", sizeof(long long)); //8
printf("%d\n", sizeof(float)); //4
printf("%d\n", sizeof(double)); // 8
printf("%d\n", sizeof(long double)); //8
return 0;
}
%zu 表示打印一个sizeof的返回的无符号整型(sizeof的返回值由zu来打印) size_t 对应的
%d 表示打印整型
- 类型的使用
char ch = 'w'; //字符型
int weight = 120; //整型
float salary = 20000.0f; //单精度浮点型
原理:
运用int 类型创建一个age变量,把20放进去 相当于 向内存申请了int大小的空间,即4个字节的空间把20放进去
5、变量
- 概念
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示
- 定义变量的方法 – 整型/浮点数+变量名称+(=)赋值;
- 变量的分类
局部变量
- 作用域:变量所在的局部范围(只在{ }中有效)
- 生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量
- 作用域:整个工程(一个c文件中的全局变量可以在另一个c文件中使用,要用extern声明)
- 生命周期:整个程序的生命周期(main函数执行结束)
注:在同一个范围内,变量只能出现一次,不能重复定义。
当全局变量和局部变量的名字相同的情况下,局部变量优先。
但是建议不要将全局和局部变量的名字写成一样的。
#include <stdio.h>为包含头文件的意思
目的:使prinf识别
本文转载自,原文链接:https://blog.csdn.net/ljh86/article/details/130537197,本文观点不代表何大锤的博客立场。