导图社区 小甲鱼C语言学习笔记
这是一篇关于小甲鱼C语言学习笔记的思维导图,主要内容有P1这个系列讲什么、P2第一个程序、P3打印、P4变量等。
编辑于2023-01-07 10:45:40小甲鱼C语言
P1 这个系列讲什么
C语言千年老二,底层语言
入门
语法
程序的调试技巧
进阶
指针的应用
多线程、多进程程序的开发
数据库的调用和管理
soket编程
探索
第一季:C语言语法
变量、数组、函数、指针、结构、标准库
第二季:C语言在Linux下的应用
对Linux终端的读写
基于ncurses库的开发
vim快速入门
多进程、多线程程序的开发
访问和管理数据库
socket网络编程
GTK+和QT来开发窗口界面
第三季:利用Arduino进行开发
改装电路,安装传感器
Windows程序设计(基于SDK)
使用C语言来调用Windows的API函数实现窗口编程
P2 第一个程序
机器码/机器语言(第一代编程语言)
0和1
CPU通过查找指令表识别0和1的具体指令
汇编语言(第二代编程语言)
编译:助记符→机器码
低级语言
C语言(第三代编程语言)(高级语言)
还有C++、C#、Objective-C、Python、Java、Delphi、Swift
C语言的优势
效率高
编译型语言,可执行文件(源代码最终被编译成机器语言)
C语言-汇编语言-机器语言-CPU语言
格式不同导致了不同的可执行文件无法跨平台直接使用
解释型语言
Jave-字节码-解释器-CPU执行
解释型编程语言为每个操作系统专门定制一个解释器作为中转,因此可以跨平台
可移植性高
对单片机而言,80%相通
灵活度高
P3 打印
设计一门编程语言,设计的就是一套规定和约定
printf("")
格式化输出函数
f指format
()内为字符串
可见字符
转义字符
占一个字节
\n\
最后的\表示上下行是合在一起的,甚至能用在平时的语句函数里面(但不能缩进)
\b 退格=Backspace
\" = "
\\ = \本身
经典例题
题目
%c、前面用XX填充、左对齐、右对齐、保留n位小数、指数
%s 字符串
答案
P4 变量
变量的意义,就是确认目标并提供存放的空间
组成
变量名
确定目标
存储单元
存放变量的值
命名规则
组成:只能由英文字母+数字+下划线
第一个字母不能是数字
不能有@
不能有空格
不能是中文
不推荐用下划线开头
区分大小写,大小写不同
习惯
小写为变量
大写为符号常量名
关键字
数据类型
char 字符型,占用一个字节
int 整型,通常反映所用机器中整数的最自然长度
float 单精度浮点型
double 双精度浮点型
声明变量的语法
数据类型 + 变量名
程序处理的两种基本数据对象:变量、常量
P5 常量和宏定义
常量
整型常量:520,1314
实型常量:3.14,5.12
字符常量
普通字符:“L”,“o”,“v”,“e”
转义字符:'\n','\t','\b'
字符串常量:“FishC”
符号常量:使用之前必须先定义
宏定义(定义符号常量)
格式 #define 标识符 常量
后面不加";"
全部字母大写
例子
易错例题
#define F(n) 2*n 问F( 3 + 2 )=?
答案为8
直接将标识符替换为常量
标识符(identifier)
命名规则(和变量相同)
为程序中的变量、类型、函数和标签起的名字
main 函数的标识符名称
字符串常量
\0 识别一字符串的结束
P6 数据类型(坑的大小)
分类
基本类型
整数类型
short int
int
long int
long long int
浮点数类型
float
double
long double
字符类型 char
唯一一个有具体尺寸 = 1字节
布尔类型 _Bool
枚举类型 enum
指针类型
构造类型
数组类型
结构类型
联合类型
空类型
sizeof运算符
用于获得数据类型和表达式的长度
sizeof (object); //sizeof (对象)
sizeof object; //sizeof 对象
sizeof (type_name); //sizeof (类型)
类型一定要加括号
限定类型(加在数据类型前面)
用于限定char类型或者任何整型变量的取值范围
[signed]
带符号位,可以存放负数
unsigned
不带符号位,只能存放正数和0,但值可以更大
默认 int 是 signed 的,需要用一半的存储空间来存放负数
unsigned long long 能够表示最大的数字是 18446744073709551615
1个字节的大小
C 语言并没有具体定义一个字节等于多少比特位,但约定俗成1Byte == 8bit
a的b次方
#include <math.h>
pow(a, b)
P7 取值范围
比特位,bit,b
CPU能读懂的最小单位
每个bit只能存放一个二进制数(0或1)
字节,Byte,B
内存机构的最小寻址单位
最大11111111,255,FF
已知字节为n,则最大bit为(2^n - 1)
1 Byte = 8 bit
进制
进制转换
overflow溢出
符号位
存放signed的类型的存储单元中,左边第一位表示符号位
该位为0,则表示该整数是一个正数
该位为1,则表示该整数是一个负数
一个32位的整型变量,除去左边第一位符号位,剩下表示值的只有31个比特位
无符号类型unsigned为%u
补码
计算机是用补码的形式来存放整数的值
正数的补码是该数的二进制形式
负数的补码
符号位为1
1.先取得该数绝对值的二进制形式
2.再将第1步的值按位取反(0和1互换)
3.最后将第2步的值加1
##使用补码的好处
最大值和最小值
正数最大为127
负数最大为-128
因为正数需要一个位置来表示 0
基本数据类型的取值范围
##定点数:用二进制表示小数
##浮点数:表示更大范围的小数
自学scanf函数
格式化输入函数
P8 字符和字符串
字符类型是特殊的整型
C语言并没有规定默认的char是signed char还是unsigned char,而是由编译系统自行决定
字符串
char 变量名[数量];
变量名[索引号] = 字符;
eg
[ ]就行,计算机会自动算个数
最后加上'\0',不然会乱码
字符串常量用双引号""即可
P9 算术运算符
"="是赋值运算符
方括号运算符是下标运算符
算术运算符
求余运算符%,两边必须是整数类型,不能是浮点型或其他类型,否则出错
目
操作数
单目运算符
双目运算符
三目运算符
表达式
用运算符和括号将操作数连接起来的式子
运算符的优先级和结合性
//是注释
类型转换
占用坑位较小的操作数先转换成占用坑位较大的操作数
操作数前 (类型) 可强制转换
P10 关系运算符和逻辑运算符
关系运算符
==中间无空格
关系表达式
用关系运算符将两边的变量、数据或表达式连接起来
只会返回一个逻辑值,0或1
逻辑运算符
不是0即为真
短路求值(最小化求值)
只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值
P11 if语句
语句1
能得到逻辑值的表达式
只有一个语句时可不用大括号
尽量加上大括号和缩进
语句2
语句3
P12 switch语句和分支嵌套
switch语句
要用break避开其他的case和default
分支结构的嵌套
悬挂else
scanf不会舍弃最后的回车符
用 getchar();
只要有if都记得加大括号{}
可以把左边的{移到上一行
等于号带来的问题
=是赋值
==是逻辑符号
小技巧,判断是否相等时把操作数对调
"Y" == ifHas
P13 while语句和do...while语句
while语句
入口条件循环
getchar()
从标准输入流里面读取下一个字符
空格也算
do...while语句
出口条件循环(循环体至少执行一次)
先执行后判断(先执行循环体里的内容,再判断表达式是否为真)
注意最后有个分号;
P14 for语句和循环嵌套
循环的基本结构
初始化计数器
循环条件
更新计数器
for语句
三个表达式用分号;隔开
表达式1:循环初始化表达式(=初始化计数器)
表达式2:循环条件表达式(=循环条件)
表达式3:循环调整表达式(=更新计数器)
表达式可按需省略,但是分号;不能省
提高程序可阅读性,没必要省略(再改回while)
for ( ; ; ) = while (1) { }
表达式1和表达式3可以是简单的表达式,也可以是逗号表达式(用逗号分隔多个表达式)
C99新标准
-std = C99
允许在for语句的表达式1中定义变量
eg-for (int i = 0; i < 100; i++)
循环嵌套
先内层循环,再外层循环
P15 break语句和continue语句
break语句
跳出
continue语句
跳过
P16 拾遗
赋值运算符
左值lvalue
右值rvalue
复合的赋值运算符
自增自减运算符(增量减量运算符)
只能作用于变量,不能作用于常量或者表达式
i++是先使用变量i里边的值,然后再对自身进行加1
++i是先加1,再使用
逗号运算符
语法:表达式1,表达式2,表达式3,...,表达式n
运算过程:从左往右逐个计算表达式
逗号表达式作为一个整体,它的值为最后一个表达式(表达式n)的值
逗号运算符的优先值低
有时候逗号只是分隔符,不是运算符
条件运算符
类似于if...else...
goto语句
直接跳转到指定的标签位置
语法:goto 标签;
尽量避免使用goto语句
跳来跳去容易破坏原来的逻辑
除非是从最里层一步到位跳到最外层
注释
解释命名的变量
解释程序或函数的功能、参数、返回值
//
/*XXXXX XXXXX XXXX*/
可跨越多行
编译器不理会
P17 数组
定义
类型 数组名[元素个数]
[]方括号内不能是变量
都是占用24个字节
数组不能动态定义
定义循环变量(for)的时候才可以写在中间
访问数组中的元素
数组名[下标]
记得-1
循环跟数组的关系
常常 初始化变量=0
宏定义直接替换
数组的初始化
定义时给初始化赋值
第一个为0,后面自动为0
第一个改成1,后面还是0
不初始化的话,数组数字是随机的(栈结构)
sizeof
计算数组的元素个数
计算数组占用的内存的大小
P18 啪啪啪
C99已支持可变数组
数组越界
不要用"i<=10"之类的
P19 字符串处理函数
字符串常量
“FishC”,“小甲鱼”,“鱼C工作室”
字符数组
推荐最后一种,可省略大括号
字符串处理函数
获取字符串的长度:strlen
%u
不包含'\0'
拷贝字符串:strcpy 和 strncpy
strcpy
需要限制原字符串的长度
strcpy(str2, str1);指从1拷贝到2
1比2长时会溢出
2比1长时会自动拷贝\0
strncpy
需要追加结束符
strncpy(str1, str2, 5); str2[5] = '\0';
连接字符串:strcat 和 strncat
strcat
记得在上半句添加空格
strcat(str1," "); strcat(str1, str2);
strncat
比较字符串:strcmp 和 strncmp
strcmp
字符串相同则返回 0
字符串不同则返回 非0
strncmp
只对比前面n个字符
P20 二维数组
定义
访问
小心越界
初始化
其他部分自动为0
只有第一维度可以不写
P21 指针
变量
变量名
真相
指针和指针变量
定义指针变量
取地址运算符和取值运算符
避免访问未初始化的指针
P22 指针和数组
数组名的真实身份
数组名其实是数组第一个元素的地址
指向数组的指针
指针的运算
P23 指针数组和数组指针
指针和数组的区别
指针数组
数组指针
P24 指针和二维数组
二维数组的定义
数组指针和二维数组
P25 void指针和NULL指针
void指针
NULL指针
NULL 不是 NUL
常见问题
1.VScode运行C程序中文乱码
复制Code runner代码设置language ID
2.Vscode保存C文件,文件名中不能有空格,否则运行不了
3.无符号类型unsigned为%u
4.用pow( , )的时候记得<math.h>
5.输入时回车也会读取,需要用getchar()拿掉
6.字符串结尾是'\0'