C语言概述

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

相关推荐
wainyz3 分钟前
Java NIO操作
java·开发语言·nio
喵叔哟11 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk17 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME17 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise17 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
Zfox_17 分钟前
【Linux】进程信号全攻略(二)
linux·运维·c语言·c++
起名字真南35 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去36 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
tyler_download1 小时前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~1 小时前
qt5将程序打包并使用
开发语言·qt