0、体系介绍
- C语言概述
- 什么是C语言
- 为什么学习C语言
- Hello World
- system函数
- C语言编译过程
- CPU内部结构与寄存器
- 汇编语言
- 集成开发环境IDE
- 数据类型
- 常量与变量
- 整型:int
- sizeof 关键字
- 字符型:char
- 实型(浮点型):float,double
- 进制
- 计算机内数据存储方式
- 类型限定符
- 字符串格式化输入输出
- 运算符与表达式
- 常用运算符分类
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 运算符优先级
- 类型转换
- 程序流程结构
- 概述
- 选择结构
- 循环结构
- 跳转语句:break,continue,goto
- 数组和字符串
- 概述
- 一维数组
- 二维数组
- 多维数组
- 字符数组与字符串
- 函数
- 概述
- 函数的定义
- 函数的调用
- 函数的声明
- main 函数与 exit 函数
- 多文件编程
- 指针
- 概述
- 指针基础知识
- 指针和数组
- 多级指针
- 指针和函数
- 指针和字符串
- 指针小结
- 内存管理
- 作用域
- 内存布局
- 内存分区代码分析
- 复合类型(自定义类型)
- 结构体
- 共用体(联合体)
- 枚举
- typedef
- 文件操作
- 概述
- 文件指针
- 文件的顺序读写
- 文件的随机读写
- Linux 和 Windows 文本文件的区别
- 获取文件状态
- 删除文件,重命名文件名
- 文件缓冲区
- Unix/Linux环境使用
1、什么是C语言
- 语言是人和人交流,C语言是人和机器交流
- 应用:大型服务器、嵌入式、网络安全
2、为什么要学习C语言
2.1、C语言特点
1)优点:
- 代码量小
- 执行速度快
- 功能强大
- 编程自由
2)缺点
- 代码实现周期长
- 可移植性较差
- 过于自由,经验不足容易出错
- 对平台库依赖较多
2.2、C语言应用领域
- 网站后台程序
- 针对某个主题写出功能强大的程序库
- 大型游戏引擎
- 写出另一种语言
- 操作系统、驱动程序
- 嵌入式微处理器开发
- web开发
- 分布式开发
- 并行计算
- 游戏逻辑
- 桌面开发
- 虚拟技术
- 数据库
- 编译器
- 大数据
- 云存储
2.3、C语言的简洁
- C语言仅有32 个关键字,9种控制语句,34种运算符
**32个关键字:**auto、break、case、switch、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、typedef、unsigned、union、void、volatile(防止编译器优化)、while
9中控制语句: if-else、for、while、do-while、continue、break、switch、goto、return
34种运算符:
- 算术运算符:+、-、*、/、%、++、--
- 关系运算符:<、<=、==、>、>=、!=
- 位运算符:<<、>>、~、|、^、&
- 逻辑运算符:&&、||、!
- 赋值运算符:=及其拓展
- 条件运算符:?:
- 逗号运算符:,
- 指针运算符:*、&
- 求字节数:sizeof
- 强制类型转换:(类型)
- 分量运算符:->、.
- 下标运算符:[]
- 其他:()
3、Hello World
c
//导入一个文件,stdio.h是一个标准库,标准输入输出库 .h头文件
//<>表示导入系统文件
//""表示导入自定义文件
#include<stdio.h>
//两个斜杠表示注释,行注释,只能注释一行
/*
块注释
可以多行注释
注释内容不参与程序编译
*/
//int 数据类型,整型,出现在函数中,表示函数的返回值类型
//main 程序的主函数,程序有且只有一个主函数 ()里面表示函数的参数
//函数的参数可以有多个,使用逗号分隔
int main()
{
//{} 函数体
//printf 是stdio.h中系统提供的函数,表示在标准输出设备上打印字符串
//""表示字符串
//;表示一条语句的结束
// \n是一个转义字符,表示换行
printf("Hello World!\n");
//return 出现在其他函数中,表示函数结束;出现在main函数中,表示程序结束
//0表示函数的返回值类型,要和函数返回值类型对应
return 0;
}
- Qt中,文件路径不能有中文,否则无法编译通过
- windows中gcc编译程序:
shell
gcc -o E:/C/hello.exe E:/C/hello.c # 前面是可执行程序,后面是源文件,源文件可以有多个
//在linux下,是:
gcc -o E:/C/hello.out E:/C/hello.c
4、system函数
调用系统的cmd命令。
4.1、system函数的使用
c
#include<stdlib.h>
int system(const char* command);
功能:在已经运行的程序中执行另外一个外部程序
参数:外部可执行程序的名字
返回值:成功返回0,失败返回其他任意数字
c
#include<stdlib.h>
#include<stdio.h>
int main()
{
// cmd 命令:calc,计算器;notepad:记事本;mspaint:画图板
//system("calc");
//可以打开一个外部的程序,如果带路径,需要使用双斜杠\\,或者使用一个正斜杠/也可以
int value;
value=system("D:\\WeChat\\WeChat.exe");
printf("%d\n", value);
return 0;
}
5、C语言编译过程
5.1、C程序编译步骤
C代码编译成可执行程序可分为四步:
1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里不会进行语法检查
2)编译:检查语法,将预处理之后的文件编译成汇编文件
3)汇编:将汇编文件生成目标文件(二进制文件)
4)链接:C语言写的程序是依赖各种库的,编译之后还需要把库链接到最终的可执行程序中去
5.2、gcc编译过程
- 分步编译:
shell
预处理:gcc -E hello.c -o hello.i # 只进行
编译:gcc -S hello.i -o hello.s
汇编:gcc -c hello.s -o hello.o
链接:gcc hello.o -o hello.exe
- 一步编译:
shell
gcc -o hello.exe hello1.c hello2.c
- 常见代码问题:
1)编辑时异常
2)编译时异常
3)运行时异常
5.3、程序执行时过程
外部存储设备(hello.exe) ↔ 保存 加载 \xleftrightarrow[保存]{加载} 加载 保存 内存(代码区,数据区,栈区,堆区) ↔ 数据交互:总线 \xleftrightarrow{数据交互:总线} 数据交互:总线 中央处理器(CPU:运算器,寄存器,控制器)
5.3、查找程序所依赖的库
windows平台下,需要使用软件 Depends.exe
6、CPU内部结构与寄存器
6.1、64位于32位系统的区别
- 寄存器是CPU内部最基本的存储单元
- CPU通过总线和外部设备进行交互,总线宽度是8位,寄存器也是8位的,这个CPU就是8位的
- 寄存器是32位的,总线是16位的,称为准32位的CPU
- 64位指令兼容32位的指令
- 64位的CPU架构上运行了64位的软件操作系统,这个系统就是64位的;64位的CPU架构上运行了32位的软件操作系统,这个系统就是32位的;64位软件不能在32位CPU上运行。
6.2、寄存器名字
8位:A、B、C、D
16位:AX、BX、CX、DX
32位:EAX、EBX、ECX、EDX
64位:RAX、RBX、RCX、RDX
6.3、寄存器、缓存、内存的关系
按与CPU的远近来分,离得最近的是寄存器,然后是缓存(CPU缓存),最后是内存
CPU计算时,先预先把要用到数据读到内存,然后再把即将要用的数据读到寄存器。
7、汇编语言和程序调试
7.1、汇编语言:
mov 移动
add 添加
push 压栈
pop 出栈
call 调用
eax 32位寄存器
简单的加法计算:
c
#include<stdio.h>
int main()
{
//数据类型,定义整型变量
int a;
int b;
int c;
__asm
{
mov a, 3
mov b, 4
mov eax, a
add eax, b
mov c, eax
}
printf("%d\n", c);
return 0;
}
7.2、断点和单步调试
- 断点添加:在选中行单击,或者按f9
- 调试程序,在调试 中选择开始调试,或按f5,快速调试
- 逐语句执行,f11;逐过程执行,f10;跳出过程,shift+f10;停止调试,shift+f5
8、集成开发环境 IDE
代码编辑器、编译器、调试器、图形用户界面
8.1、VS
整行复制:光标定位在该行任意位置,ctrl+c
整行剪切:光标定位在该行任意位置,ctrl+x
智能提示:ctrl+j
自动补全:tab
智能补全:alt+ → \rightarrow →
大小写转换:选中内容,ctrl+shift+u
整行代码上下移动:alt+上下方向键
格式化代码:ctrl+k+f
8.2、Qt Creator
格式化代码:ctrl+i
注释、取消注释:ctrl+/
自动完成函数定义:alt+enter
编译,但不调试,运行:ctrl+r
编译,不运行:ctrl+b