1. 常用库函数内容(补充记忆)
1.1 #include
- 格式化数据输入:scanf("%控制格式字符 ...", &变量名(即变量地址),...)
- 格式化数据输出:printf("%控制格式字符 ...", 变量名/常量,...)
- 格式化数据写入字符串:sprintf(字符数组地址, "%控制格式字符 ...", 变量名/常量,...)
- 字符串输入:gets(字符数组地址)
- 字符串输出:puts(字符串地址)
1.1.1 printf相关内容
printf常用控制格式字符表
格式字符 | 表示含义 | 格式字符 | 表示含义 |
---|---|---|---|
%c | 单个字符 | %s | 字符串 |
%d or %i | 有符号整数(十进制) | %u | 无符号整数(十进制) |
%x | 小写无符号整数(十六进制) | %X | 大写无符号整数(十六进制) |
%o | 无符号整数(八进制) | %f or %lf | 浮点数 |
%e | 小写指数(科学计数法) | %E | 大写指数(科学计数法) |
%p | 内存地址 |
printf格式字符前缀表
字符前缀 | 形式说明 | 功能作用 |
---|---|---|
- | %-d、%-f | 启用左对齐模式(默认右对齐) |
+ | %+d、%+f | 开启符号全显模式(默认只显示负号) |
空格 | % d、% f | 使正数输出时带前缀(一个空格) |
# | %#o、%#x、%#X | 输出带前缀(八进制为0、十六进制为0x/0X) |
数字.数字 | %5.4f、%5d、%.4f、%05d | 左侧数字表示输出所占位数/长度, 右侧数字表示输出所保留的小数位 |
PS:当左侧数字以0开头且不足所需位数时,通过往左侧补充0来补足位数。
除此之外,左侧通过补充空格来补足位数。(以上情况均为右对齐模式)
1.1.2 scanf相关内容
scanf常用控制格式字符表
格式字符 | 表示含义 | 格式字符 | 表示含义 |
---|---|---|---|
%c | 单个字符 | %s | 字符串 |
%d | 有符号整数(十进制) | %u | 无符号整数(十进制) |
%o | 无符号整数(八进制) | %x or %X | 无符号整数(十六进制) |
%f | float类型浮点数 | %lf | double类型浮点数 |
%i | 有符号整数(不限进制) | %e or %E | 指数(科学计数法) |
PS:scanf函数遇终止符结束读取
常见终止符表
终止字符 | 功能作用 | 终止字符 | 功能作用 |
---|---|---|---|
0x20 | 空格 | \r | 回车 |
\n | 换行 | \f | 换页 |
\t | 水平制表符 | \v | 垂直制表符 |
1.1.3 sprintf函数(string print format)
- 功能:将格式化数据转化为字符并写入字符串中
声明:
int sprintf(char * string, const char * format, [argument]...);
- 返回值:表明经过转化后所占字符串的位数
1.1.4 gets()函数(get string)
- 功能:从控制台输入字符串
- 特性:读取换行符(‘\n’)之前的所有字符,并自行在结尾处添加空字符(‘\0’)
声明:
char * gets(char * string);
PS:当传入的字符数组内存空间不足以容纳从控制台输入的字符时,会导致缓冲区溢出
1.1.5 puts()函数(put string)
- 功能:从控制台输出字符串
- 特性:输出时会自行在末尾追加换行符(‘\n’)
声明:
int puts(const char * string);
- 返回值:成功返回正数,失败返回EOF
PS:在性能上puts函数要优于printf函数,但在适用度上puts函数还是稍逊一筹
1.2 #include
- 运行界面暂停:
使用格式:
system("pause");
- 内存操作:
申请内存
直接分配:malloc(内存所需字节)
精确分配:calloc(单位内存数量,单位内存字节)
重新分配:realloc(内存地址,内存所需字节)回收内存:free(内存地址)
PS:
①申请操作的返回值均为所分配内存空间的首地址
②精确分配会自行将数据内容初始化为0,而其余两者的分配均未进行初始化
- 字符串转化:atoi(字符串地址)
1.2.1 malloc()函数(memory allocate)
- 功能:分配内存所需的字节空间
声明:
void * malloc(unsigned int size);
1.2.2 calloc()函数(clear allocate)
- 功能:为内存分配具体数量、字节的空间,并使用0完成初始化操作
声明:
void * calloc(unsigned int count, unsigned int size);
1.2.3 realloc()函数(reallocate)
- 功能:重新分配内存所需的字节空间
声明:
void * realloc(void * memory, unsigned int size);
1.2.4 free()函数
- 功能:回收使用完毕的字节空间
声明:
void free(void * memory);
1.2.5 atoi()函数(ASCII to integer)
ASCII(American Standard Code for Information Interchange)
- 功能:将数字字符串中的数字转化为相应的十进制数字
声明:
int atoi(const char * string);
PS:编译器在C语言标准之外通常还会定义一个itoa函数,用于实现相反的操作
itoa(数字,字符数组地址,转化进制)
声明:
char * itoa(int number, char * string, int radix);
1.3 #include
- 操作内存:
- 设置内容:memset(内存地址, 所需内容, 所需字节)
- 复制内容:memcpy(粘贴地址, 复制地址, 所需字节)
- 移动内容:memmove(终点地址, 起点地址, 所需字节)
- 比较内容:memcmp(内存地址1, 内存地址2, 所需字节)
PS:除了比较操作是返回整型数字来表明比较结果外,其余三者则均是返回目标地址
- 操作字符串:
获取长度:strlen(字符串地址)
比较字符:strcmp(字符串地址1, 字符串地址2)
比较指定字符:strncmp(字符串地址1, 字符串地址2, 待比字符数量)查找指定字符(首次出现):strchr(字符串地址, 指定字符)
查找指定字符(最后出现):strrchr(字符串地址, 指定字符)
查找子串:strstr(字符串地址, 待找子串地址)连接字符:strcat(目标字符串地址, 待接字符串地址)
连接指定字符:strncat(目标字符串地址, 待接字符串地址, 待接字符数量)复制字符:strcpy(粘贴字符串地址, 复制字符串地址)
1.3.1 memset()函数(memory set)
- 功能:将指定的前多少个字节的空间设置为指定的内容,以实现内存空间初始化
声明:
void * memset(void * memory, int value, unsigned int size);
PS:常用于为数组、字符串等类型赋值
1.3.2 memcpy()函数(memory copy)
- 功能:将某空间指定的前多少个字节的内容复制到指定的另一内存空间中去
声明:
void * memcpy(void * paste, const void * copy, unsigned int size);
PS:
此函数只是单纯复制内容,并无灵活应对空间重叠的预案。
因此当复制空间与粘贴空间重叠时,容易出现无法预知的错误结果。
1.3.3 memmove()函数(memory move)
- 功能:将某空间指定的前多少个字节的内容转移到指定的另一内存空间中去
声明:
void * memmove(void * destination, const void * source, unsigned int size);
PS:区别于复制操作,此函数可以解决空间重叠问题
首先明确若存在空间重叠问题,那么总共会出现两种不同的情况
要么destination在source前产生重叠,要么destination在source后产生重叠当destination在source空间前时,按顺序正常转移内容即可
而当destination在source空间后时,则需要通过倒序的方式来转移内容
1.3.4 memcmp()函数(memory compare)
- 功能:对两个空间中指定的前多少个字节的字符串内容进行比较
声明:
int (const char * buffer1, const char * buffer2, unsigned int size);
- 返回值:
①当buffer1 > buffer2时,返回正数
②当buffer1 < buffer2时,返回负数
③当两者相等时,则返回0
1.3.5 strlen()函数(string length)
- 功能:获取字符串的具体长度(即有效字节数),不包括末尾的‘\0’
声明:
unsigned int strlen(const char * string);
1.3.6 strcmp()函数(string compare)
- 功能:比较两个字符串的内容
声明:
int strcmp(const char * string1, const char * string2);
PS:此函数不能传入字符指针作为参数,例如*p=‘a’或者ch='a',*p=&ch中的指针
- 返回值:
①当string1 > string2时,返回正数
②当string1 < string2时,返回负数
③当两者相等时,则返回0
1.3.7 strncmp()函数(string number compare)
- 功能:比较两个字符串前多少个字符的内容
声明:
int strncmp(const char * string1, const char * string2, unsigned int number);
PS:此函数不能传入字符指针作为参数,例如*p=‘a’或者ch='a',*p=&ch中的指针
- 返回值:
①当string1 > string2时,返回正数
②当string1 < string2时,返回负数
③当两者相等时,则返回0
1.3.8 strchr()函数(string character)
- 功能:查找字符串中某个字符第一次出现的位置
声明:
char * strchr(const char * string, char character);
1.3.9 strrchr()函数(string rear/right全称存疑 character)
- 功能:查找字符串中某个字符最后一次出现的位置
声明:
char * strrchr(const char * string, char character);
1.3.10 strstr()函数(string string)
- 功能:查找字符串中某个子串第一次出现的位置
声明:
char * strstr(const char * string, const char * substring);
1.3.11 strcat()函数(string concatenate)
- 功能:将一个字符串的字符拼接到目标字符串的末尾
声明:
char * strcat(char * destination, const char * source);
PS:当目标字符串的内存空间不足以容纳拼接时,会导致缓冲区溢出
1.3.12 strncat()函数(string number concatenate)
- 功能:将一个字符串的前多少个字符拼接到目标字符串的末尾
声明:
char * strcat(char * destination, const char * source, unsigned int number);
PS:当目标字符串的内存空间不足以容纳拼接时,会导致缓冲区溢出
1.3.13 strcpy()函数(string copy)
- 功能:复制一个字符串中的字符并粘贴到目标字符串
声明:
char * strcpy(char * paste, const char * copy);
1.4 #include
- 计算某数的平方根:sqrt(数字)(square root calculations)
声明:
double sqrt(double number);
2. 机器数篇
- 定义:一个数在计算机中的二进制存储形式
- 真值:具有符号位的机器数所对应的数值
原码、反码、补码
- 原码 = 符号位 + |数|的二进制
PS:符号位为0表示正数,为1表示负数- 正数:反码 = 原码
负数:反码 = 符号位 + ~原码的非符号位
PS:~表示取反- 正数:补码 = 原码
负数:补码 = 反码 + 1
PS:数最终以补码的形式在计算机中储存
3. 关键字篇(方便日后检索)
3.1 关键字
- 定义:在编程语言中早已定义并被赋予特殊含义的单词
- 亦称:保留字
32个关键字按照类型划分
类型 | ||||
---|---|---|---|---|
常规变量 | int | float | double | char |
变量修饰 | long | short | signed | unsigned |
特殊变量 | enum | struct | union | |
变量新名 | typeof | |||
运算符 | sizeof | |||
定义常量 | const | |||
选择语句 | if | else | ||
switch | case | default | ||
循环语句 | for | while | do | |
终止语句 | continue | break | return | |
跳转语句 | goto | |||
函数修饰 | void | extern | static | |
其他 | auto | register | volatile |
32个关键字详情
名称 | 功能 | 名称 | 功能 |
---|---|---|---|
int | 整型变量 | char | 字符型变量 |
float | 单精度浮点型变量 | double | 双精度浮点型变量 |
long | 较长变量 | short | 较短变量 |
signed | 有符号变量 | unsigned | 无符号变量 |
struct | 结构体变量 | union | 共用体变量 |
enum | 枚举型变量 | typeof | 变量类型别名 |
sizeof | 获取数据长度 (变量/关键字) |
const | 固定的变量 (即常量) |
if | 通用选择 | else | ~通用选择 |
switch | 定项选择 | case | 定项选择选项 |
default | 定项选择默认项 | for | 已知次数循环 |
while | 未知次数循环 | do | 进行一次循环轮次 |
break | 终止当前语句 | return | 终止当前函数 |
continue | 跳过当前循环轮次 | goto | 跳转到指定语句 |
extern | 外部函数 | static | 内部(静态)函数、静态变量 |
void | 无返回项函数 | auto | 没学过(未完待续) |
register | 没学过(未完待续) | volatile | 没学过(未完待续) |
3.2 标识符
命名规则
- 仅由数字、字母、下划线构成
- 禁止以数字作为标识符首位
- 其名称不得与关键字起冲突
4. 常量(常数)篇(方便日后检索)
4.1 整型常量
- 十进制整数:正常书写形式(取值范围0-9)
- 八进制整数:0+其他(取值范围0-7)
- 十六进制整数: 0X/0x+其他(取值范围0-9、a-f、A-F)
PS:通过添加后缀L or l来表示长整型数
4.2 实型(浮点型)常量
- 十进制小数:数字 + .(小数点) + 数字
- 指数(科学计数法):数字(整数/小数) + e/E + 整数
4.3 字符常量
- 普通字符:正常书写形式
- 转义字符:\ + 特定字符
转义字符表
转义字符 | 对应功能 | 转义字符 | 对应功能 |
---|---|---|---|
\' | 输出单引号 | \" | 输出双引号 |
\\ | 输出反斜杠 | \a | 警告(alert) |
\b | 退格(backspace) | \f | 换页(form feed) |
\n | 换行 | \r | 回车(carriage return) |
\t | 水平制表符 | \v | 垂直制表符 |
\数(otcal) (0-177) |
八进制数表示ASCII码字符 | \x数(hexadecimal) (0-7f) |
十六进制数表示ASCII码字符 |
PS:ASCII码(American Standard Code for Information Interchange)美国信息交换标准编码
ASCII码表
- ASCII码:控制字符(0-31)、打印字符(32-126)
数字 (十进制) |
对应字符 | 功能作用 | 数字 (十进制) |
对应字符 | 功能作用 |
---|---|---|---|---|---|
0 | NULL(null) | 空字符 | 64 | @ | at符号 |
1 | SOH(start of headline) | 标题开始 | 65 | A | 大写字母A |
2 | STX(start of text) | 正文开始 | 66 | B | 大写字母B |
3 | ETX(end of text) | 正文结束 | 67 | C | 大写字母C |
4 | EOT(end of transmission) | 传输结束 | 68 | D | 大写字母D |
5 | ENQ(enquiry) | 查询 | 69 | E | 大写字母E |
6 | ACK(acknowledge) | 告知获悉 | 70 | F | 大写字母F |
7 | BEL(bell) | 响铃 | 71 | G | 大写字母G |
8 | BS(backspace) | 退格 | 72 | H | 大写字母H |
9 | HT(horizontal tab) | 水平制表符 | 73 | I | 大写字母I |
10 | LF(line feed) NL(new line) |
换行 | 74 | J | 大写字母J |
11 | VT(vertical tab) | 垂直制表符 | 75 | K | 大写字母K |
12 | FF(form feed) NP(new page) |
换页 | 76 | L | 大写字母L |
13 | CR(carriage return) | 回车 | 77 | M | 大写字母M |
14 | SO(shift out) | 取消切换 | 78 | N | 大写字母N |
15 | SI(shift in) | 启用切换 | 79 | O | 大写字母O |
16 | DLE(data link escape) | 数据链路转义 | 80 | P | 大写字母P |
17 | DC1(device control 1) | 终端控制1 | 81 | Q | 大写字母Q |
18 | DC2(device control 2) | 终端控制2 | 82 | R | 大写字母R |
19 | DC3(device control 3) | 终端控制3 | 83 | S | 大写字母S |
20 | DC4(device control 4) | 终端控制4 | 84 | T | 大写字母T |
21 | NAK(negative acknowledge) | 拒绝应答 | 85 | U | 大写字母U |
22 | SYN(synchronous idle) | 同步闲置 | 86 | V | 大写字母V |
23 | ETB(end of trans block) | 传输块终止 | 87 | W | 大写字母W |
24 | CAN(cancel) | 取消 | 88 | X | 大写字母X |
25 | EM(end medium) | 媒介终止 | 89 | Y | 大写字母Y |
26 | SUB(substitute) | 代替 | 90 | Z | 大写字母Z |
27 | ESC(escape) | 转义 | 91 | [ | 左中括号 |
28 | FS(file separator) | 文件分割符 | 92 | \ | 反斜杠 |
29 | GS(group separator) | 组分割符 | 93 | ] | 右中括号 |
30 | RS(record separator) | 记录分割符 | 94 | ^ | 次方符 |
31 | US(unit separator) | 单元分割符 | 95 | _ | 下划线 |
32 | SP(space) | 空格 | 96 | ` | 右上点 |
33 | ! | 叹号 | 97 | a | 小写字母a |
34 | " | 双引号 | 98 | b | 小写字母b |
35 | # | 井号 | 99 | c | 小写字母c |
36 | $ | 美元符 | 100 | d | 小写字母d |
37 | % | 百分符 | 101 | e | 小写字母e |
38 | & | 取地址符 | 102 | f | 小写字母f |
39 | ' | 单引号 | 103 | g | 小写字母g |
40 | ( | 左括号 | 104 | h | 小写字母h |
41 | ) | 右括号 | 105 | i | 小写字母i |
42 | * | 乘号 | 106 | j | 小写字母j |
43 | + | 加号 | 107 | k | 小写字母k |
44 | , | 逗号 | 108 | l | 小写字母l |
45 | - | 减号 | 109 | m | 小写字母m |
46 | . | 小数点 | 110 | n | 小写字母n |
47 | / | 除号 | 111 | o | 小写字母o |
48 | 0 | 数字0 | 112 | p | 小写字母p |
49 | 1 | 数字1 | 113 | q | 小写字母q |
50 | 2 | 数字2 | 114 | r | 小写字母r |
51 | 3 | 数字3 | 115 | s | 小写字母s |
52 | 4 | 数字4 | 116 | t | 小写字母t |
53 | 5 | 数字5 | 117 | u | 小写字母u |
54 | 6 | 数字6 | 118 | v | 小写字母v |
55 | 7 | 数字7 | 119 | w | 小写字母w |
56 | 8 | 数字8 | 120 | x | 小写字母x |
57 | 9 | 数字9 | 121 | y | 小写字母y |
58 | : | 冒号 | 122 | z | 小写字母z |
59 | ; | 分号 | 123 | { | 左大括号 |
60 | < | 小于 | 124 | | | 竖线 |
61 | = | 等于 | 125 | } | 右大括号 |
62 | > | 大于 | 126 | ~ | 取反符 |
63 | ? | 问号 | 127 | DEL (delete) |
删除 |
4.4 符号常量
- 定义:在C语言中使用标识符来表示常量
- 声明:#define 标识符 常数
- 宏定义:以#开头的预处理命令
5. 存储单位篇
5.1 位(bit)
- 定义:计算机中的最小数据单位,其状态为0 or 1
5.2 字节(B byte)
- 定义:存储空间的基本计量单位,1 byte = 8 bit
- 一个英文字母存储需要1 byte,而一个汉字存储需要2 byte
- 注意:k表示1000,而K表示1024,即2^10
- 1 TB = 2^10 GB = 2^20 MB = 2^30 KB = 2^40 B
6. 运算符篇(方便日后检索)
6.1 取余(取模)运算符(符号表示:%)
如果z % x = y,那么z = n*x + y,则y = z - n*x,其中n = z / x
求余数y有两种方式,分别为truncate法和floor法,这两种方式的区别点在于对n的计算
- truncate法:通过舍弃n的小数部分,得到一个整数
- floor法:通过向下取整n的小数部分,得到一个整数
C语言、Java语言采用truncate方式求余数,即y = z - truncate(z / x) * x
Python语言采用floor方式求余数,即y = z - floor(z / x) * x
6.2 逗号运算符(符号表示:,)
如果变量 = (表达式1, 表达式2, 表达式3, ..., 表达式n),则变量最终在表达式1-n完成运算后被赋值为表达式n,即变量 = 表达式n
6.3 位运算符
- 定义:对二进制数每一位进行运算的符号
位运算符表
运算符号 | 功能作用 | 运算符号 | 功能作用 |
---|---|---|---|
& | 按位与 | | | 按位或 |
~ | 取反 | ^ | 按位异或 |
<< | 左移 | >> | 右移 |
- "<<" 运算符:二进制数的每一位整体左移一位,高位舍弃,低位以零作补充
- “>>” 运算符:二进制数的每一位整体右移一位,高位延用符号位,低位舍弃
PS:正(负)数右移,高位补0(1),补充数延用曾经的符号位。
6.4 运算符优先级
- 括号 > 算术 > 关系 > 逻辑 > 赋值 > 逗号
运算符的优先级与结合方向表
优先级 | 运算符号 | 功能作用 | 使用形式 | 结合方向 |
---|---|---|---|---|
最高1 | () | 括号运算符 | (表达式) or 函数名(形参表) | 从左向右 |
[] | 下标运算符 | 数组名[常量表达式] | ||
. | 对象选择成员 | 对象.成员名 | ||
-> | 指针选择成员 | 对象指针.成员名 | ||
2 | ! | 逻辑非运算符 | !表达式 | 从右向左 |
~ | 按位取反运算符 | ~表达式 | ||
++ | 自增运算符 | 变量名++、++变量名 | ||
-- | 自减运算符 | 变量名--、--变量名 | ||
+ | 正号运算符 | +变量名 | ||
- | 负号运算符 | -变量名 | ||
* | 取值运算符 | *指针变量 | ||
& | 取地址运算符 | &变量名 | ||
(类型) | 强制类型转换 | (数据类型)表达式 | ||
sizeof | 求所占字节数 | sizeof(变量名 or 关键字) | ||
3 | * | 乘运算符 | 表达式*表达式 | 从左向右 |
/ | 除运算符 | 表达式/表达式 | ||
% | 取余运算符 | 整型表达式%整型表达式 | ||
4 | + | 加运算符 | 表达式+表达式 | 从左向右 |
- | 减运算符 | 表达式-表达式 | ||
5 | << | 左移运算符 | 变量名<<表达式 | 从左向右 |
>> | 右移运算符 | 变量名>>表达式 | ||
6 | > | 大于运算符 | 表达式>表达式 | 从左向右 |
>= | 大于等于运算符 | 表达式>=表达式 | ||
< | 小于运算符 | 表达式<表达式 | ||
<= | 小于等于运算符 | 表达式<=表达式 | ||
7 | == | 等于运算符 | 表达式==表达式 | 从左向右 |
!= | 不等于运算符 | 表达式!=表达式 | ||
8 | & | 按位与运算符 | 表达式&表达式 | 从左向右 |
9 | ^ | 按位异或运算符 | 表达式^表达式 | 从左向右 |
10 | | | 按位或运算符 | 表达式|表达式 | 从左向右 |
11 | && | 与运算符 | 表达式&&表达式 | 从左向右 |
12 | || | 或运算符 | 表达式||表达式 | 从左向右 |
13 | ? : | 条件运算符 | 表达式 ? 表达式 : 表达式 | 从右向左 |
14 | = | 赋值运算符 | 变量名=表达式 | 从右向左 |
+= | 加后赋值 | 变量名+=表达式 | ||
-= | 减后赋值 | 变量名-=表达式 | ||
*= | 乘后赋值 | 变量名*=表达式 | ||
/= | 除后赋值 | 变量名/=表达式 | ||
%= | 取余后赋值 | 变量名%=表达式 | ||
<<= | 左移后赋值 | 变量名<<=表达式 | ||
>>= | 右移后赋值 | 变量名>>=表达式 | ||
&= | 按位与后赋值 | 变量名&=表达式 | ||
^= | 按位异或赋值 | 变量名^=表达式 | ||
|= | 按位或赋值 | 变量名|=表达式 | ||
最低15 | , | 逗号运算符 | 表达式,表达式,... | 从左向右 |
7. 函数篇
7.1 函数基础
7.1.1 定义与声明
- 函数定义:函数完整的功能代码
PS:在C语言中,如果不写函数的返回类型,则默认其为int类型
(仅ANSI C生效、C99中即被取消) - 函数声明:目前通常使用函数原型的方式来作为函数声明
PS:当自定义函数定义在main函数之后时,需要在main函数之前进行函数声明
7.1.2 函数原型
- 定义:由函数返回类型、函数名称、参数列表组成的格式代码
PS:以数组为参数等价于以相对应类型的指针为参数,两者均把实参地址赋予形参
两种书写形式
函数返回类型 函数名称(参数类型 参数名称,...参数类型n 参数名称n);
函数返回类型 函数名称(参数类型,...参数类型n);
7.2 内存四区
区域名称 | 分配方式 | 释放时刻 | 存储内容 | 特点 |
---|---|---|---|---|
栈区 | 自动分配 | 函数结束 | 函数参数 局部变量 |
内存:大小固定、空间连续 数据:执行速度快、先进先出 |
堆区 | 手动分配 | 手动释放 | 自定义内容 | 内存:易产生碎片 数据:执行速度慢 |
数据区 | 自动分配 | 程序结束 | 全局变量 静态变量 各类常量 |
全局变量、静态变量在内存中分两块区域 一块为初始化的, 另一块为未初始化的 |
代码区 | 二进制代码 | 充当机器与程序的中间桥梁 通过二进制代码索引程序中的函数 |
PS:当堆区中被分配的空间忘记释放时,将会导致内存泄漏(内存渗漏)
7.3 特殊函数
7.3.1 外部函数
- 定义:能够被其他源文件所调用的函数
声明:
extern 函数返回类型 函数名称(参数列表);
PS:C语言声明外部函数时可以省略关键字extern
7.3.2 内部(静态)函数
- 定义:只在其被定义的文件中有效的函数
声明:
static 函数返回类型 函数名称(参数列表);
8. 指针/地址篇(指针即地址)
8.1 基础指针的特殊形式
8.1.1 无类型指针
- 定义:使用void *修饰的指针
- 特性:操作前需要先将其转化为其他类型
8.1.2 空指针
- 定义:未指向内存空间的指针
- 构造:通过将指针赋值为0或NULL来生成空指针
PS:通常在定义一个指针后就要将其初始化为空指针
8.1.3 野指针
- 定义:指向不可用内存空间的指针
- 特性:操作野指针容易导致程序失控,出现意想不到的错误
产生原因:
1.指针定义后未初始化为空指针
2.内存空间使用完后未及时释放对应指针
8.2 进阶指针
8.2.1 行指针(数组指针)
- 定义:指向一维数组地址的指针
- 功能:用于实现对二维数组的访问
语法格式:
类型名称 (*变量名称) [一维数组容量];
8.2.2 函数指针
- 定义:指向函数起始地址的指针
语法格式:
类型名称 (*变量名称) (参数列表);
PS:与函数原型类似,参数列表可以只表明参数类型
- 使用:(*函数指针) (实参) 等价于 函数名称 (实参)
8.2.3 二级指针
- 定义:指向指针变量地址的指针
语法格式:
类型名称 ** 变量名称;
PS:
①更高级指针形式依次类推
②多级指针通常用于函数参数,解决在函数内部分配内存空间而主函数无法获取的情况
8.2.4 常量指针
- 定义:指向常量地址的指针
- 特性:地址可变,值不变
语法格式:
const 类型名称 * 变量名称;
9. 数组与字符串篇
- 数组定义:具有相同数据类型的集合
字符串 = 字符数组 + '\0'(空字符)
10. 关联篇
10.1 指针数组
- 定义:具有相同数据类型的指针集合
语法格式:
类型名称 * 变量名称[数组容量];
10.2 指针函数
- 定义:返回值为指针的函数
语法格式:
函数返回类型 * 函数名称(参数列表);
10.3 main()函数
- 定义:接受系统参数的程序入口
语法格式:
函数返回类型 main(数组容量,字符串指针数组);
int main(int argumentCount, char * argumentVector[]);
PS:数组中第一个指针指向运行程序的文件名,数组容量由系统自动赋值
10.4 指针常量
- 定义:储存内容为地址的常量
- 特性:地址不变,值可变3
语法格式:
类型名称 * const 常量名称;
10.5 指向常量的指针常量
- 定义:储存内容为常量地址的常量
- 特性:地址不变,值不变
语法格式:
const 类型名称 * const 常量名称;
11. 结构体与共用体篇
11.1 结构体
- 定义:具有不同数据类型的集合
PS:集合中的数据被称作成员
11.1.1 结构体变量
语法格式:
11.1.2 结构体数组
11.1.3 结构体指针
11.2 共用体
11.3 生成别名
12. 预处理篇
12.1 宏定义
- 功能:使用字符串替换相应标识符,即文本替换
- 使用位置:源程序开头,函数定义外部
- 有效范围:宏定义语句→源文件末尾
- 特性:允许嵌套,但不支持递归
PS:末尾无需加分号,出现运算符时尽量使用括号,以免出现错误
12.1.1 无参数宏
语法格式:
#define 标识符 字符串
- 字符串:通常是常量、表达式一类的
12.1.2 有参数宏
语法格式:
#define 标识符(形参表) 字符串
- 形参表:形式类似于函数的参数列表,多个参数之间用逗号分隔
- 字符串:通常是常量、表达式一类的
有参宏与有参函数的比较:
情况分析 | 有参数的宏定义 | 有参数的函数 |
---|---|---|
操作时段 | 预处理 | 程序(函数)运行时 |
参数类型 | 无参数类型 | 手动定义参数类型 |
参数存储 | 不额外分配内存,无值传递问题 | 给参数分配内存,有形参与实参的区别 |
运行速度 | 快 | 相对较慢 函数调用会涉及参数传递、压栈、出栈等步骤 |
12.1.3 取消宏定义
语法格式:#undef 标识符
12.1.4 预定义宏
预定义宏名称 | 预定义宏功能 | 输出格式 |
---|---|---|
__DATE__ | 显示源文件的编译日期 | 字符串(%s) |
__TIME__ | 显示源文件的编译时间 | 字符串(%s) |
__FILE__ | 显示源文件的文件名称 | 字符串(%s) |
__LINE__ | 显示其此刻所处代码的行号 | 数字(%d) |
__FUNCTION__ | 显示其此刻所处函数的名称 | 字符串(%s) |
12.2 文件包含
- 功能:在一个源程序文件(通俗讲就是含有代码的文件)中引入另一个源程序文件
语法格式:
系统(标准)格式:#include <文件名称>
- 搜索范围:只在系统指定的路径下搜索文件名称
用户(自定义)格式:#include "文件名称"
- 搜索范围:优先于当前文件所在目录进行搜索,其次再到系统指定的路径搜索
12.3 条件编译
- 定义:根据条件与否来决定程序中的指定内容是否进行编译
12.3.1 选择代码执行
- 功能:根据判断条件决定执行哪段代码
语法格式:
#if 判断条件
程序内容 //满足判断条件执行此处代码
#else
程序内容 //不满足判断条件执行此处代码
#endif
12.3.2 判断宏已定义
- 功能:判断宏是否已被定义
语法格式:
#ifdef 宏名称
程序内容 //当宏已经被定义时执行此处代码
#else
程序内容 //不满足条件时执行此处代码
#endif
12.3.3 判断宏未定义
- 功能:判断宏是否未被定义,可以有效预防重定义问题
语法格式:
#ifndef 宏名称
程序内容 //当宏未经定义时执行此处代码
#else
程序内容 //不满足条件时执行此处代码
#endif
13. 文件篇
13.1 流(stream)
- 定义:
- 输入流:输出流:
13.1.1 文本流
13.1.2 二进制流
13.1.3 预定义流
13.2 文件分类
13.2.1 二进制文件
13.2.2 文本文件
13.3 文件缓冲区
13.4 相关指针
13.4.1 文件指针
13.4.2 文件位置指针
类:class public protected private mutable
布尔:bool true false
内存:new delete
命名空间:namespace using
异常:try catch throw
函数修饰:virtual friend template inline
指针:this
导出:export
操作符:operator
汇编:asm
类型转换:const_cast static_cast dynamic_cast reinterpret_cast explicit
type组:typeid typename
宽字符:wchar_t
其他:and and_eq not not_eq or or_eq xor xor_eq bitand bitor
~:compl(compliment)