当前位置: 首页 > news >正文

C语言总结复习

⼀、C 语⾔基础概述
1.1 C 语⾔特点
结构化、模块化编程语⾔,兼具⾼级语⾔与低级语⾔特性,执⾏效率⾼,可移植性强,是系统编
程、嵌⼊式开发的核⼼语⾔。
程序结构:由⼀个主函数 main ()和若⼲⾃定义函数组成,程序从main()开始执⾏,到main() 结束。
1.2 基本语法规则
1.语句以分号;结尾,分号是语句结束的标志。
2.注释:单⾏注释//注释内容 ,多⾏注释/*注释内容*/(多⾏注释不可嵌套)。
3.标识符:由字⺟、数字、下划线组成,⾸字符不能是数字,区分⼤⼩写,不能使⽤关键字(如
int、if、for 等)。
4.关键字:C 语⾔预留的 32 个关键字,具有固定语法含义,不可⾃定义使⽤。
1.3 数据类型
1.3.2 类型修饰符
signed(有符号,默认)、unsigned(⽆符号):仅修饰整型、字符型,扩⼤正数范围。
例: unsigned int a;取值范围 0~2³²-1。
1.3.3 常量与变量
常量:程序运⾏中值不变的量,分为整型常量、浮点常量、字符常量(单引号 'a')、字符串常
量(双引号"abc")、符号常量(#define PI 3.14)。
变量:先定义、后使⽤,定义格式: 数据类型 变量名;,例:int a; float b;
⼆、运算符与表达式
2.1 运算符分类
1.算术运算符:+、-、*、/、%(取余,仅适⽤于整型)、++(⾃增)、--(⾃减)
前置 ++/--:先运算,后赋值;后置 ++/--:先赋值,后运算。
例:int a=5,b; b=a++;→ b=5,a=6;b=++a;→ b=6,a=6。
2.赋值运算符:=、+=、-=、*=、/=、%=
复合赋值:a+=3等价于a=a+3
3.关系运算符:><=、==(等于)、!=(不等于),结果为真(1)或假(0)。
4.逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑⾮)
短路特性:&& 左侧为假,右侧不运算;|| 左侧为真,右侧不运算。
5.位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取 <(左移)、>>(右移)
左移:⾼位丢弃,低位补 0,等价于乘 2;右移:正数⾼位补 0,负数⾼位补 1,等价于除 2。
6.条件运算符: 表达式1?表达式2:表达式3,三⽬运算符,简化 if-else 语句。
2.2 运算符优先级
单⽬运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符,优先级不确定时加括号()提升
优先级。
2.3 表达式求值
⾃动类型转换:低精度向⾼精度转换(char→int→float→double)。
强制类型转换: (⽬标类型)表达式 ,例:(int)3.14结果为 3。
三、流程控制语句
3.1 顺序结构
程序按代码书写顺序依次执⾏,是默认执⾏结构。
3.2 选择结构3.2.1 if 语句
1.单分⽀:if(条件){语句块;}
2.双分⽀:if(条件){语句1;}else{语句2;}
3.多分⽀:
代码块
if(条件1){语句1;}
else if(条件2){语句2;}
...
else{语句n;}
3.2.2 switch 语句
代码块
switch(表达式){
case常量1:语句1;break;
case常量2:语句2;break;
default:默认语句;break;
}
注意:表达式必须是整型 / 字符型,case 后必须是常量,break 不可省略(否则 case 穿透),
default 可选。
3.3 循环结构
3.3.1 for 循环
代码块
for(初始化表达式;条件表达式;更新表达式){
循环体;
}
执⾏顺序:初始化→条件判断→循环体→更新表达式→条件判断,适合已知循环次数的场景。
3.3.2 while 循环
代码块
while(条件){
循环体;
}
先判断条件,再执⾏循环体,可能⼀次不执⾏,适合未知循环次数的场景。
3.3.3 do-while 循环
代码块
do{
循环体;
}while(条件);
先执⾏循环体,再判断条件,⾄少执⾏⼀次。
3.4 跳转语句
1.break:跳出当前循环 /switch 语句,终⽌整个循环。
2.continue:跳过本次循环剩余语句,直接进⼊下⼀次循环判断。
3.goto:⽆条件跳转,慎⽤,易破坏程序结构。
四、数组
4.1 ⼀维数组
定义: 数据类型 数组名[数组⻓度];,例:int arr[5];
初始化: int arr[5]={1,2,3,4,5};int arr[]={1,2,3};(长度自动匹配)
引⽤:数组名 [下标],下标从0 开始,最⼤下标为⻓度 - 1,越界访问会导致程序异常。
4.2 ⼆维数组
定义: 数据类型 数组名[行][];,例:int arr[2][3];
初始化: int arr[2][3]={{1,2,3},{4,5,6}};
存储:按⾏优先存储,本质是⼀维数组的数组。
4.3 字符数组与字符串
字符数组: char str[6]={'h','e','l','l','o'};
字符串:以'\0'(字符串结束符)结尾,char str[]="hello";(⾃动补 '\0')
字符串处理函数(需 <string.h>`):
strcpy (⽬标,源):字符串复制
strcat (⽬标,源):字符串拼接
strlen (字符串):求字符串⻓度(不含 '\0')
strcmp (字符串 1, 字符串 2):字符串⽐较,相等返回 0
五、函数
5.1 函数定义与调⽤
定义格式:
返回值类型 函数名(参数列表){
函数体;
return返回值;
}
⽆返回值:返回值类型为 void,⽆需 return 语句。
函数声明:函数调⽤前需声明,格式: 返回值类型 函数名(参数列表);,解决函数调⽤顺序问
题。
5.2 参数传递
1.值传递:实参将值拷⻉给形参,形参修改不影响实参,单向传递。
2.地址传递:实参传递地址,形参通过地址操作实参,双向传递(指针实现)。
5.3 函数分类
库函数:C 语⾔⾃带,需包含对应头⽂件(如 <stdio.h>`)。
⾃定义函数:⽤⼾根据需求编写的函数。
递归函数:函数⾃⾝调⽤⾃⾝,需设置递归出⼝,避免死循环。
5.4 局部变量与全局变量
局部变量:定义在函数 / 代码块内,作⽤域仅限当前函数 / 代码块,栈区分配,⾃动释放。
全局变量:定义在函数外,作⽤域整个程序,静态存储区,程序结束释放,默认初始化为 0。
六、指针
6.1 指针基础
指针:存储变量内存地址的变量,定义: 数据类型 *指针变量名;,例:int *p;
取地址符 &:获取变量地址, p=&a; (p 指向变量 a)
解引⽤符 *:通过指针访问指向的变量, *p=10;等价于a=10;
6.2 指针与数组
数组名代表数组⾸地址,是常量指针, int arr[5]; int *p=arr;
指针访问数组: p[i]等价于arr[i]*(p+i)等价于arr[i]
6.3 指针与函数
指针作为函数参数:实现地址传递,修改实参值。
函数指针:指向函数的指针,⽤于回调函数。
指针函数:返回值为指针类型的函数, int *fun(int a,int b);
6.4 空指针与野指针
空指针: int *p=NULL;,指向地址 0,不可解引⽤。
野指针:指向未知内存地址的指针,避免使⽤,指针使⽤前需初始化。
七、结构体与共⽤体
7.1 结构体
定义:⾃定义复合数据类型,可存储不同类型数据
struct结构体名{
数据类型 成员1;
数据类型 成员2;
};
定义变量: struct结构体名 变量名;
成员访问:普通变量⽤ ., 变量名.成员名 ;指针变量⽤->, 指针->成员名
7.2 共⽤体(联合体)
定义: union共⽤体名{成员列表};
特点:所有成员共享同⼀块内存空间,同⼀时间只能存储⼀个成员,内存⼤⼩为最⼤成员⻓度。
7.3 枚举类型
定义: enum枚举名{枚举常量1,枚举常量2,...};
特点:枚举常量默认从 0 开始赋值,依次 + 1,可⼿动赋值,⽤于固定取值的变量。
⼋、动态内存分配
8.1 核⼼函数 <stdlib.h>`)
1.malloc:void *malloc(size_t size);,分配指定字节的内存,返回 void * 指针,未初始
化。
例: int *p=(int *)malloc(4*sizeof(int));
2.calloc:void *calloc(size_t num,size_t size);,分配 num 个 size 字节的内存,
初始化为 0。
3.realloc:void *realloc(void *ptr,size_t size);,重新调整已分配内存的⼤⼩。
4.free:void free(void *ptr);,释放动态分配的内存,避免内存泄漏,释放后指针置空。
8.2 注意事项
动态内存分配在堆区,需⼿动释放,避免野指针和内存泄漏。
返回指针需强制转换为对应数据类型。
九、⽂件操作
9.1 ⽂件指针
定义: FILE *fp;,⽤于操作⽂件,是⽂件操作的核⼼。
9.2 ⽂件打开与关闭
打开: fp=fopen("⽂件名","打开⽅式");
常⽤打开⽅式:r(只读)、w(只写,清空新建)、a(追加)、rb(⼆进制读)、wb(⼆进
制写)
关闭: fclose(fp);,必须关闭⽂件,避免数据丢失。
9.3 ⽂件读写函数
1.字符读写:fgetc ()、fputc ()
2.字符串读写:fgets ()、fputs ()
3.格式化读写:fscanf ()、fprintf ()
4.⼆进制读写:fread ()、fwrite ()
9.4 ⽂件定位
feof ():判断⽂件是否结束
fseek ():移动⽂件指针
tell ():获取⽂件指针当前位置
⼗、预处理指令
10.1 宏定义
⽆参宏: #define宏名 常量/表达式 ,例:#define MAX 100
带参宏: #define宏名(参数)表达式 ,例:#define ADD(a,b) a+b,⽆类型检查,直
接替换。
10.2 ⽂件包含
-<头⽂件>`:包含系统头⽂件
#include "头⽂件":包含⾃定义头⽂件
10.3 条件编译
#ifdef、#ifndef#else#endif,根据条件编译指定代码,⽤于程序调试和跨平台开
发。
⼗⼀、C 语⾔易错点总结
1.变量未初始化直接使⽤,导致随机值。
2.数组下标越界访问,引发程序崩溃。
3.字符串忘记添加结束符 '\0',导致乱码。
4.指针未初始化 / 野指针解引⽤,内存报错。
5.动态内存分配后未释放,造成内存泄漏。
6.switch 语句遗漏 break,出现 case 穿透。
7.逻辑运算符 &&、|| 使⽤不当,混淆 &、|。
8.函数参数值传递与地址传递混淆,⽆法修改实参。
⼗⼆、核⼼考点与实战技巧
1.重点掌握:数据类型、流程控制、数组、函数、指针、结构体。
2.编程思路:先分析需求,确定数据结构,再编写流程,最后调试优化。
3.调试⽅法:分步打印变量值,检查边界条件、指针越界、内存分配问题。
4.代码规范:合理缩进,变量名⻅名知意,添加注释,提⾼可读性。
http://www.jsqmd.com/news/695497/

相关文章:

  • 《AI大模型应用开发实战从入门到精通共60篇》008、LangChain框架入门:构建LLM应用的第一块积木
  • 从‘迁就’到‘协同’:深入理解PCIe设备枚举时,MPS与MRRS的‘谈判’过程与系统影响
  • 从零实战:2026 SMT工厂数字孪生开发选型
  • Claude Code进阶指南:从模块化配置到自动化工作流实战
  • WarcraftHelper终极指南:5分钟解决魔兽争霸3现代兼容性问题
  • CefFlashBrowser:如何在2024年完美播放Flash游戏和课件的终极指南
  • 从 LangChain 到 LangGraph:为什么你的 Agent 需要图结构
  • Ubuntu 20.04远程桌面实战:Vino和TigerVNC到底怎么选?从配置到性能的深度对比
  • SMT产线数字孪生:2026选型避坑实战
  • UML 类图及六大关系详解:继承、实现、依赖、关联、聚合、组合(Java+类图)
  • PostgreSQL libpq 由于整数回绕导致内存分配不足 HGVE-2025-E011
  • 机器学习中不平衡分类问题的采样策略与实践
  • 从‘踩坑’到‘填坑’:我的DVWA靶场搭建复盘,附PHPStudy 2024版最新配置要点
  • 2026年45L铝制行军锅技术解析与合规选型参考 - 优质品牌商家
  • 《AI大模型应用开发实战从入门到精通共60篇》009、LangChain之Model I/O:模型调用与输出解析
  • 新能源汽车专业升级,仿真教学软件科学布局指南
  • 录屏软件罢工?手把手教你用终端搞定MacOS Catalina的屏幕录制权限(附常见App包名查询)
  • 如何快速掌握Zotero翻译插件:提升研究效率的完整教程
  • 多模型接入统一API网关:通义、DeepSeek、智谱的兼容实践(附代码)
  • FreeSWITCH图形化界面实操:讯时FXO网关当‘中继’,分机打外线就这么配
  • 《AI大模型应用开发实战从入门到精通共60篇》010、LangChain之Prompt Templates:模板化你的提示词
  • Drawboard PDF免费版被砍后,我的7个工具位怎么分配最合理?(附颜色配置方案)
  • LSTM超参数调优实战:时间序列预测指南
  • 词嵌入技术解析:从Word2Vec到Transformer演进
  • 毕业答辩PPT还在熬夜肝?让百考通AI帮你把时间还给思考
  • 德国蔡司三维扫描仪国内授权经销商综合实力排行:德国蔡司三维扫描仪,德国蔡司三维蓝光扫描仪atos-q,排行一览! - 优质品牌商家
  • 终极MCP服务器:模块化架构与AI应用开发实战指南
  • 手把手教你用这5个脚本,榨干甲骨文免费服务器的网速潜力
  • 基于进化计算的多智能体协作框架:从原理到实践
  • 手把手搭建第一个企业级AI Agent:从零配置LangChain环境