- main函数-程序的入口
主函数有且只有一个
main无参形式
/*
函数名:main
函数参数:无
函数返回值:返回0:表示函数正常退出返回非0:表示函数异常退出
*/
int main(void)
{/* code */return 0;
}
main有参形式
/*
函数名:main
函数参数:argc:参数个数argv:参数数组,每个参数是一个字符串
函数返回值:返回0:表示函数正常退出返回非0:表示函数异常退出
*/
int main(int argc, char const *argv[])
{/* code */return 0;
}
- man帮助手册(九册)
提供命令、函数、系统调用、配置文件等的权威说明
1.Shell命令(默认已安装)
2.系统调用(函数手册 - 这些函数由系统内核直接提供)
3.库函数(函数手册 - 这些函数有标准库提供)
4.特殊文件(通常出现在/dev目录下)
5.文件的特殊格式或协定(例如/etc/passwd的格式)
6.游戏
7.杂项(例如一些宏定义)
8.系统管理员命令(通常只能由管理员执行)
9.非标准内核例程
系统只安装第一册,以下帮助信息一般需要用户自己手动安装
sudo apt-get install manpages
sudo apt-get install manpages-dev
sudo apt-get install manpages-posix
sudo apt-get install manpages-posix-dev
使用技巧
//查看指定命令/函数的手册(自动匹配优先章节)
man [名称] # 例:man cp、man malloc
//查看指定章节的内容
man [章节号] [名称] # 例:man 3 malloc、man 5 sshd_config
//搜索包含关键词的所有手册(-k 表示“keyword”)
man -k [关键词] # 例:man -k "file copy"(搜索与“文件复制”相关的命令)
- printf-标准输出
printf原型
/*
函数名:printf
函数参数:format:格式化字符串...:可变参数列表,对应格式说明符的具体值
函数返回值:int 类型,成功时返回打印的字符总数失败时返回负数
*/
int printf(const char *format, ...);
- scanf
scanf原型
/*
函数名:scanf
函数参数:format:格式化字符串...:可变参数列表,指向用于存储输入数据的变量地址
函数返回值:int 类型,成功时返回成功读取并赋值的变量个数失败时返回EOF(通常为-1),遇到文件结束或错误时返回
*/
int scanf(const char *format, ...);
- 格式控制符
类型符 | 含义 | 示例 | 输出结果 |
---|---|---|---|
%d |
十进制整数(int ) |
printf("%d", 123); |
123 |
%u |
无符号十进制整数(unsigned ) |
printf("%u", 123U); |
123 |
%x |
十六进制整数(小写) | printf("%x", 255); |
ff |
%X |
十六进制整数(大写) | printf("%X", 255); |
FF |
%o |
八进制整数 | printf("%o", 8); |
10 |
%f |
浮点数(float /double ) |
printf("%f", 3.14); |
3.140000 |
%c |
单个字符(char ) |
printf("%c", 'A'); |
A |
%s |
字符串(char* ) |
printf("%s", "hello"); |
hello |
%p |
指针地址 | printf("%p", &a); |
0x7ffd8a5b9a3c |
%% |
输出 % 本身 |
printf("%%"); |
% |
- 附加格式修饰符
修饰符格式 | 含义说明 | 示例代码 | 输出结果(注:用“□”标记空格,便于查看对齐效果) |
---|---|---|---|
%md |
输出宽度为 m (m 为正整数),不足宽度用空格填充,内容右对齐 |
printf("%5d", 10); |
□□□10 (共5位,前补3个空格) |
%-md |
输出宽度为 m (m 为正整数),不足宽度用空格填充,内容左对齐 |
printf("%-5d", 10); |
10□□□ (共5位,后补3个空格) |
%0md |
输出宽度为 m (m 为正整数),不足宽度用 0 填充(仅对数值有效) |
printf("%05d", 10); |
00010 (共5位,前补3个0) |
%m.nf |
输出总宽度为 m ,同时保留 n 位小数,不足总宽度用空格填充 |
printf("%8.2f", 3.14159); |
□□□3.14 (总8位,小数点后2位,前补3个空格) |
%.nf |
不限制输出宽度,仅指定保留 n 位小数(宽度随内容自适应) |
printf("%.3f", 3.14); |
3.140 (仅保留3位小数,无空格填充) |
%*.*f |
输出宽度和小数位数由参数动态指定(第一个 * 对应宽度,第二个 * 对应小数位) |
printf("%*.*f", 8, 2, 3.14); |
□□□3.14 (效果同 %8.2f ,参数依次传入宽度、小数位、数值) |
- 基本数据类型
- 整型
类型声明 | 符号属性 | 占用内存(字节) | 取值范围(以对应系统位数为准) | 适用场景 |
---|---|---|---|---|
char |
有符号 | 1 | -128 ~ 127 |
存储单个字符(ASCII 码) |
unsigned char |
无符号 | 1 | 0 ~ 255 |
存储无负数值(如颜色值、字节) |
short |
有符号 | 2 | -32768 ~ 32767 |
存储较小范围的整数 |
unsigned short |
无符号 | 2 | 0 ~ 65535 |
存储无负的小整数 |
int |
有符号 | 4 | -2147483648 ~ 2147483647 |
默认整数类型(最常用) |
unsigned int |
无符号 | 4 | 0 ~ 4294967295 |
存储非负整数(如计数、ID) |
long |
有符号 | 4(32 位系统)/ 8(64 位系统) | -2147483648 ~ 2147483647 (32 位系统) |
存储较大范围的整数 |
unsigned long |
无符号 | 4(32 位系统)/ 8(64 位系统) | 0 ~ 4294967295 (32 位系统) |
存储无负的大整数 |
long long |
有符号 | 8 | -9223372036854775808 ~ 9223372036854775807 |
存储极大范围的整数(C99 标准新增) |
unsigned long long |
无符号 | 8 | 0 ~ 18446744073709551615 |
存储无负的极大整数 |
- 浮点型
类型声明 | 占用内存(字节) | 有效数字位数 | 取值范围(近似) | 适用场景 |
---|---|---|---|---|
float |
4 | 6~7 位 | ±3.4×10^-38 ~ ±3.4×10^38 |
单精度浮点数(内存占用小,精度要求低) |
double |
8 | 15~17 位 | ±1.7×10^-308 ~ ±1.7×10^308 |
双精度浮点数(默认浮点类型,精度要求高) |
long double |
8/12/16(因编译器/平台而异) | 18~19 位 | ±3.4×10^-4932 ~ ±1.1×10^4932 |
高精度浮点数(极少用,如科学计算) |
- 布尔类型(头文件<stdbool.h>)
类型声明 | 占用内存(字节) | 取值范围 | 说明 |
---|---|---|---|
bool |
1(通常) | true / false |
true 等价于整数 1,false 等价于整数 0 |
- 常量与变量
-
- 变量是程序运行中值可以动态变化的内存单元,需声明数据类型,用于存储临时结果、用户输入等可变数据。
-
- 常量是值一旦定义就不可修改的标识符,分为字面常量(直接写在代码中的值)和符号常量(用#define或const定义的有名字的常量),用于表示固定不变的数据(如 π 值、配置参数等)。
特性 | 变量(Variable) | 常量(Constant) |
---|---|---|
定义方式 | 数据类型 + 变量名(可初始化) 例: int num = 10; |
1. 宏常量:#define 常量名 值 例: #define MAX 100 2. 常变量: const 类型 常量名 = 值 例: const float PI = 3.14f |
值的可修改性 | 运行中可通过赋值语句修改 例: num = 20; |
定义后不可修改,强行修改会编译报错 |
数据类型 | 必须显式声明类型(如 int 、float ) |
宏常量无类型;常变量需显式声明类型 |
内存分配 | 定义时分配内存,存储在可读写区域 | 宏常量不分配内存(预处理阶段直接文本替换); 常变量分配内存(可能在只读区域) |
作用域 | 局部变量:函数/代码块内有效 全局变量:整个程序有效 |
宏常量无作用域(预处理全局替换); 常变量作用域与变量一致(局部/全局) |
生命周期 | 局部变量:函数/代码块执行期间存在 全局变量:程序运行期间一直存在 |
宏常量无生命周期(预处理阶段生效); 常变量生命周期与变量一致 |
初始化要求 | 局部变量可先声明后赋值(未初始化时为随机值) 全局变量未初始化时默认值为 0 |
必须在定义时初始化(否则无意义) |
典型用途 | 存储临时数据、用户输入、状态变化等(如计数器、中间结果) |
- 类型转换
类型转换是将一种数据类型的值转换为另一种数据类型的过程,主要用于不同类型数据之间的运算或赋值。 -
- 隐式类型转换
隐式类型转换由编译器自动完成,无需程序员干预,遵循 "低精度向高精度转换" 的原则(避免数据丢失)
- 隐式类型转换
-
- 算术运算中的转换
不同类型数据参与运算时,自动转换为其中精度最高的类型
转换优先级(从低到高):char → short → int → unsigned int → long → unsigned long → long long → float → double → long double
- 算术运算中的转换
-
- 赋值运算中的转换
右值自动转换为左值的类型
若右值精度高于左值,可能导致数据截断或精度损失
- 赋值运算中的转换
-
- 函数调用中的转换
实参自动转换为形参的类型
- 函数调用中的转换
eg
#include <stdio.h>int main() {char c = 'A'; // 'A'的ASCII码为65int i = 100;float f = 3.14f;double d = 2.718;// 1. 算术运算转换int result1 = c + i; // c自动转换为int(65 + 100 = 165)double result2 = i + f; // i和f自动转换为double(100.0 + 3.14 = 103.14)// 2. 赋值转换int result3 = f; // f(3.14)转换为int(3),精度损失float result4 = d; // d(2.718)转换为float(2.718f),可能损失精度printf("c + i = %d\n", result1); // 输出:165printf("i + f = %lf\n", result2); // 输出:103.140000printf("f -> int = %d\n", result3); // 输出:3printf("d -> float = %f\n", result4); // 输出:2.718000return 0;
}
-
- 显示类型转换
显式类型转换由程序员手动指定,使用强制转换运算符实现,语法为:(目标类型) 表达式
- 显示类型转换
eg
#include <stdio.h>int main() {float f = 3.14159f;int i = 100;double d = 2.71828;// 强制转换示例int num1 = (int)f; // 将float转换为int(3.14159 → 3)float num2 = (float)d; // 将double转换为float(可能损失精度)char ch = (char)i; // 将int转换为char(100 → 'd',ASCII码)// 运算中的强制转换float average = (float)10 / 3; // 10先转换为float,结果为3.333...int area = (int)(3.14 * 5 * 5); // 先计算再转换,结果为78printf("(int)3.14159 = %d\n", num1); // 输出:3printf("(float)2.71828 = %f\n", num2); // 输出:2.718280printf("(char)100 = %c\n", ch); // 输出:dprintf("(float)10/3 = %f\n", average); // 输出:3.333333printf("(int)(3.14*5*5) = %d\n", area); // 输出:78return 0;
}
- 源码补码反码
编码方式 | 定义说明 | 正数表示规则 | 负数表示规则 | 示例(以 -3 为例,8 位) |
---|---|---|---|---|
源码 | 直接用符号位和数值位表示的二进制形式,符号位(最高位)0 表示正,1 表示负 | 符号位为 0,数值位为二进制绝对值 | 符号位为 1,数值位为二进制绝对值 | 10000011 |
反码 | 正数与源码相同,负数是对源码的数值位按位取反(符号位不变)得到的编码形式 | 与源码相同(符号位 0,数值位不变) | 符号位为 1,数值位按位取反(0→1,1→0) | 11111100 |
补码 | 正数与源码相同,负数是对反码加 1(若有进位则丢弃)得到的编码形式,是计算机实际存储整数的方式 | 与源码相同(符号位 0,数值位不变) | 反码 + 1(若反码加 1 后有进位,直接丢弃) | 11111101 |
- 附- ASCII码
十进制 | 二进制 | 字符 | 说明(控制字符)/ 字符(可打印字符) | 十进制 | 二进制 | 字符 | 说明(控制字符)/ 字符(可打印字符) |
---|---|---|---|---|---|---|---|
0 | 00000000 | NUL | 空字符 | 64 | 01100000 | @ | 艾特符号 |
1 | 00000001 | SOH | 标题开始 | 65 | 01100001 | A | 大写字母A |
2 | 00000010 | STX | 文本开始 | 66 | 01100010 | B | 大写字母B |
3 | 00000011 | ETX | 文本结束 | 67 | 01100011 | C | 大写字母C |
4 | 00000100 | EOT | 传输结束 | 68 | 01100100 | D | 大写字母D |
5 | 00000101 | ENQ | 询问字符 | 69 | 01100101 | E | 大写字母E |
6 | 00000110 | ACK | 确认字符 | 70 | 01100110 | F | 大写字母F |
7 | 00000111 | BEL | 响铃(告警) | 71 | 01100111 | G | 大写字母G |
8 | 00001000 | BS | 退格(Backspace) | 72 | 01101000 | H | 大写字母H |
9 | 00001001 | HT | 水平制表符(\t) | 73 | 01101001 | I | 大写字母I |
10 | 00001010 | LF | 换行(\n) | 74 | 01101010 | J | 大写字母J |
11 | 00001011 | VT | 垂直制表符 | 75 | 01101011 | K | 大写字母K |
12 | 00001100 | FF | 换页 | 76 | 01101100 | L | 大写字母L |
13 | 00001101 | CR | 回车(\r) | 77 | 01101101 | M | 大写字母M |
14 | 00001110 | SO | 移位输出 | 78 | 01101110 | N | 大写字母N |
15 | 00001111 | SI | 移位输入 | 79 | 01101111 | O | 大写字母O |
16 | 00010000 | DLE | 数据链路转义 | 80 | 01110000 | P | 大写字母P |
17 | 00010001 | DC1 | 设备控制1 | 81 | 01110001 | Q | 大写字母Q |
18 | 00010010 | DC2 | 设备控制2 | 82 | 01110010 | R | 大写字母R |
19 | 00010011 | DC3 | 设备控制3 | 83 | 01110011 | S | 大写字母S |
20 | 00010100 | DC4 | 设备控制4 | 84 | 01110100 | T | 大写字母T |
21 | 00010101 | NAK | 否定应答 | 85 | 01110101 | U | 大写字母U |
22 | 00010110 | SYN | 同步空闲 | 86 | 01110110 | V | 大写字母V |
23 | 00010111 | ETB | 传输块结束 | 87 | 01110111 | W | 大写字母W |
24 | 00011000 | CAN | 取消 | 88 | 01111000 | X | 大写字母X |
25 | 00011001 | EM | 媒体结束 | 89 | 01111001 | Y | 大写字母Y |
26 | 00011010 | SUB | 替换 | 90 | 01111010 | Z | 大写字母Z |
27 | 00011011 | ESC | 转义(Escape) | 91 | 01111011 | [ | 左方括号 |
28 | 00011100 | FS | 文件分隔符 | 92 | 01111100 | \ | 反斜杠 |
29 | 00011101 | GS | 组分隔符 | 93 | 01111101 | ] | 右方括号 |
30 | 00011110 | RS | 记录分隔符 | 94 | 01111110 | ^ | 插入符号 |
31 | 00011111 | US | 单元分隔符 | 95 | 01111111 | _ | 下划线 |
32 | 01000000 | (空格) | 空格 | 96 | 10000000 | ` | 反引号 |
33 | 01000001 | ! | 感叹号 | 97 | 10000001 | a | 小写字母a |
34 | 01000010 | " | 双引号 | 98 | 10000010 | b | 小写字母b |
35 | 01000011 | # | 井号 | 99 | 10000011 | c | 小写字母c |
36 | 01000100 | $ | 美元符号 | 100 | 10000100 | d | 小写字母d |
37 | 01000101 | % | 百分号 | 101 | 10000101 | e | 小写字母e |
38 | 01000110 | & | 和号 | 102 | 10000110 | f | 小写字母f |
39 | 01000111 | ' | 单引号 | 103 | 10000111 | g | 小写字母g |
40 | 01001000 | ( | 左括号 | 104 | 10001000 | h | 小写字母h |
41 | 01001001 | ) | 右括号 | 105 | 10001001 | i | 小写字母i |
42 | 01001010 | * | 星号 | 106 | 10001010 | j | 小写字母j |
43 | 01001011 | + | 加号 | 107 | 10001011 | k | 小写字母k |
44 | 01001100 | , | 逗号 | 108 | 10001100 | l | 小写字母l |
45 | 01001101 | - | 减号/连字符 | 109 | 10001101 | m | 小写字母m |
46 | 01001110 | . | 句号 | 110 | 10001110 | n | 小写字母n |
47 | 01001111 | / | 斜杠 | 111 | 10001111 | o | 小写字母o |
48 | 01010000 | 0 | 数字0 | 112 | 10010000 | p | 小写字母p |
49 | 01010001 | 1 | 数字1 | 113 | 10010001 | q | 小写字母q |
50 | 01010010 | 2 | 数字2 | 114 | 10010010 | r | 小写字母r |
51 | 01010011 | 3 | 数字3 | 115 | 10010011 | s | 小写字母s |
52 | 01010100 | 4 | 数字4 | 116 | 10010100 | t | 小写字母t |
53 | 01010101 | 5 | 数字5 | 117 | 10010101 | u | 小写字母u |
54 | 01010110 | 6 | 数字6 | 118 | 10010110 | v | 小写字母v |
55 | 01010111 | 7 | 数字7 | 119 | 10010111 | w | 小写字母w |
56 | 01011000 | 8 | 数字8 | 120 | 10011000 | x | 小写字母x |
57 | 01011001 | 9 | 数字9 | 121 | 10011001 | y | 小写字母y |
58 | 01011010 | : | 冒号 | 122 | 10011010 | z | 小写字母z |
59 | 01011011 | ; | 分号 | 123 | 10011011 | { | 左花括号 |
60 | 01011100 | < | 小于号 | 124 | 10011100 | | | 竖线 |
61 | 01011101 | = | 等号 | 125 | 10011101 | } | 右花括号 |
62 | 01011110 | > | 大于号 | 126 | 10011110 | ~ | 波浪号 |
63 | 01011111 | ? | 问号 | 127 | 01111111 | DEL | 删除(Delete) |