C 语言
重点-核心-本质
- 内存
- 进程
- 线程
计算机基础
内存:外存与CPU的桥梁
(1)物理构成
内存条——元器件组成——0V(断电)或5V(通电)——0(表示断电)或1(表示通电)
即内存条由上亿个电子元器件组成,它们组成电路的电压有0V和5V两种:0V表示断电,用0表示;5V表示通电,用1表示。
1、 通过电路来控制这些元器件的通断电, 会得到很多 0、1 的组合。例如,
8 个元器件
有 28=256 种
不同的组合,
2、 1 个元器件称为1 比特(Bit)
或1 位
,8 个元器件称为1 字节(Byte)
(2)内存的作用
程序在内存中运行(而不是在硬盘中)。
对于读写速度, 内存 > 固态硬盘 > 机械硬盘。
机械硬盘是靠电机带动盘片转动来读写数据的, 而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。
其过程如下:
- 载入内存:加载器(Loader)将硬盘中的数据复制到内存,接着交给CPU来处理
- 处理数据:CPU 直接从内存中读取数据,处理完成后将结果再写入内存。(如有需要,会将数据复制到硬盘进行保存)
(2)虚拟内存
当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。
这样,硬盘中就会有一部分空间用来存放内存中暂时不用的数据。这一部分空间就叫做虚拟内存(Virtual Memory)。
数据储存:二进制和字符编码
(1)二进制
计算机要处理的信息是多种多样的,如数字、 文字、 符号、 图形、 音频、 视频等,,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式(0 和 1 序列)来表示。
(2)字符编码
将文字与二进制进行对应的规则就叫做字符编码:
- ASCII编码:针对英文
标准 ASCII 编码共收录了 128 个字符(空闲了一个比特位),其中包含了 33 个控制字符(具有某些特殊功能但是无法显示的字符)和 95 个可显示字符。 - GB2312 编码和 GBK 编码:针对中文
- Unicode编码:全世界的文字
数据“交互”:编译链接
- 编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。
- 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可加载、可执行代码的过程
编译(compile)
编译:.c文件(源代码)——>目标文件/临时文件/中间文件(.obj文件-Visual C++或者.o文件-GCC)
C 语言的编译器有很多种,不同的平台下有不同的编译器:
- Windows 下常用的是微软开发的 Visual C++,它被集成在 Visual Studio 中
- Linux 下常用的是 GUN 组织开发的 GCC
- Mac 下常用的是 LLVM/Clang,它被集成在 Xcode 中(Xcode 以前集成的是 GCC,来由于 GCC 的不配合才改为 LLVM/Clang,LLVM/Clang 的性能比 GCC 更加强大
链接(link)
链接其实就是一个“打包”的过程,它将所有二进制形式的目标文件(object file)和系统组件组合成一个可执行文件。
完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。
链接:目标文件 + 系统组件 ——> 可执行文件
C语言主流编译器
如果不是特别强调,一般情况下我们所说的“编译器”实际上也包括了链接器。
C语言的编译器主要有两大块:桌面操作系统和嵌入式操作系统。
C语言程序
引子
(1)基础
头文件:.h文件(索引函数库)
main()函数:主函数,一个程序有且只有一个,是程序的入口函数
语句结束:必须使用 ;
返回值:int 型
(2)名词解释
puts = output string
printf = print format
scanf = scan format
(3)模板
#include<stdio.h> // include:复制头文件
int main()
{
puts("C语言学习");
return 0;
}
变量和数据类型
变量赋值:在内存中找一块区域用来存放数据,并用变量名命名这个内存空间。(多次连续赋值给同一个变量,会导致之前的数据消失)
注意,C语言定义变量时,要指明数据的数据类型。
(数据类型除了指明数据的①解释方式,还指明了②数据的长度。-下面有讲)
注:C语言变量与Python变量的区别
-
C语言中,定义一个变量是将值放到变量盒子里面去;
赋值b=a,就是新建一个盒子,然后把值赋值一份放过去,特点是:两个值之间完全独立。 -
Python中,赋值变量就是贴标签的意思。
上面的 a=2 之后,1就没有归属了,就无法调用了,python的基于引用的内存管理器很快就会把这个对象的内存给清理掉的。
数据类型
概述
(1)数据类型
数据类型除了指明数据的解释方式,还指明了数据的长度。
(2)数据类型长度:
所谓数据长度(Length),是指数据占用多少个字节
-
在定义变量时还要指明数据的长度。
-
在 C 语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。
附: 静态类型语言、动态类型语言
要了解什么是动态语言,要首先了解“类型检查”。静态类型语言,即在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。C、C++、Java、C#和Scala都是静态类型语言。
说大白话,意思就是动态类型语言可以直接进行变量赋值(在变量赋值之前不需要定义其变量类型),而静态类型语言必须先由人工定义变量类型,而后才能对其进行赋值。