C语言复习笔记¶
1 控制流¶
if-else语句¶
条件表达式表示相等关系用 == 而非 =
默认 else 与最近的 if 相配
条件运算符¶
当 condition 为真,执行 expression1 ;否则执行 expression2。并将 expression 的值作为整个表达式的返回值
switch语句¶
计算表达式的值,测试是否与常量整数相配,执行分支动作
break 使程序跳出switch语句
continue¶
-
当
x==5时,不执行printf,直接x++ -
while语句continue直接到while ( 条件 ),可能死循环
2 函数¶
函数声明¶
声明必须在调用之前完成,且不能放在其他函数体内
函数定义¶
模块化编程¶
函数的形参与实参
- 形参:函数定义中的参数
- 实参:函数调用中的参数
参数的传递方式:值传递,将实参的值复制给形参,二者相互独立,不共享内存单元
空间域¶
{} 括住的就是变量的空间域(作用域)
变量重名时,空间域小的变量起作用
时间域¶
存储类型决定变量的存储位置和存在状态
常用4种存储类型:
- auto
- register
- static
- extern
全局变量¶
全局变量是定义在 main 函数之外的变量,作用于整个程序
3 数组¶
二维数组¶
C语言采用行优先存储
a[i][j]=str[i*n+j] ,其中 n 为列数
字符串¶
字符数组以 \0 结尾形成字符串
只有初始化时可以给字符数组整体赋值,例如:
"hello" 本身为指向字符串 hello 的指针,"hello"[0] 为 'h'
gets, scanf, fgets¶
gets(s) 读到 \n 停止,并自动补 \0 ,不会补 \n
scanf("%s",s) 以空格结束,scanf("%[^\n]",str) 以 \n 结束,不包括 \n
fgets 自动补 \n
常用的字符串处理函数¶
4 指针¶
指针与地址¶
指针是一种数据类型
指针变量是具有指针类型的变量,在数据类型前加 * ,就构成了指针类型。存储的内容永远是地址
-
x是int型,&x返回的地址是int *型,可以直接赋给同类型的指针变量p -
变量的访问
- 变量名直接访问
- 通过指向变量的指针间接访问
*p 是指针 p 所指的值, 此语句使得变量 x 的值被更改为 3
指针与数组¶
数组名作为表达式可隐式转换为指向数组首元素的指针
p[i] \(\iff\) *(p+i)
注意数组名是常量
const修饰¶
- 常量指针
- 指向常量
-
const char* p -
指针常量
- 指针本身不能改变指向
char* const p;- 常量指针常量
const char* const p
字符串与char*型指针¶
指针与函数¶
- 希望函数返回多个值,可用指针作形参
优先级¶
() [] . -> 优先级最高
解引用 * = 自加/减 > 加减 ,相等时从右至左结合
a = (*p)++ \(\iff\) a = *p; a++
a = *p++ \(\iff\) a = *p; p++
a = *++p 先对p自增,再取内容
sprintf¶
将变量“输出”到字符串中(而非屏幕上)
例如:计算 sin(x) 并保留 m 位小数
sscanf¶
将字符串按指定格式读入
数组指针¶
a 等价于 &a[0] ,是 int* 型指针
&a 是 int *[10] 型指针,指向数组,加1移过整个数组,即10个 int
p 是 a 的地址,p[0] 是首元素的地址,*p 是数组 a
指针数组¶
重心在数组,元素类型为指针的数组
指针与二维数组¶
*a 指向 a[0][0] ,是 int* 型
函数指针¶
定义: 类型 (* 指针变量名)(参数类型);
定义了一个函数指针 funPtr,指向的函数原型为 double fun(int, int)
指向函数的指针指向函数的入口地址
给函数指针变量赋值时, 只需给出函数名
调用方式: (* 函数指针变量名)(实参表) 函数指针变量名 (实参表)
返回指针值的函数¶
5 动态内存申请与释放¶
malloc¶
<stdlib.h>
原型 void *malloc(size_t); 接收申请内存空间的字节数,返回指向这片空间的指针
free¶
原型 void free(void * _Memory);
6 位运算¶
&按位与|按位或^按位异或~按位取反<<左移>>右移
优先级¶
!(逻辑非) > 按位取反 ~ >算术运算符 > 左移运算符 << 右移运算符 >> > 关系运算符 > 按位与 & 按位异或 ^ 按位或 |> 逻辑与 && >逻辑或 || > 赋值运算符
计算¶
7 结构体¶
定义¶
类型定义:
变量定义:
也可以一起定义:
指针¶
struct Person *p
引用成员:(*p).age 或 p->age
结构体快排¶
成员的对齐¶
原理较复杂,总之尽量将占内存小的成员放在前
自定义类型名¶
typedef 原类型名 新类型名;
联合union¶
联合类型的变量在不同时刻维持定义的不同类型和不同长度的对象
联合体 union 和 struct 的定义和使用是相同的,但 union 中的各个数据之间共享同一个单元的,所占内存单元的大小是成员中长度最大的一个。
自引用结构¶
数据+指向自身结构的指针
枚举类型¶
8 输入与输出¶
main函数的形参¶
argc 是包含命令在内的参数个数
argv 是字符型指针数组, 指向每一个参数字符串,argv[0] 是命令本身
命令行之tail¶
显示文件的最后n行:tail [-n] filename
打开文件¶
r只读w只写。为写创建一个新文件,若指定的文件已存在,则其中原有内容被删去a追加写。向文件尾增加数据。若指定的文件不存在,则创建一个新文件r+读写。为读写打开一个文件。若指定的文件不存在,则返回NULLw+读写。为读写打开一个新文件。若指定的文件已存在, 则其中原有内容被删去a+读与追加写。为读写向文件尾增加数据打开一个文件,若指定的文件不存在,则创建一个新文件
读写文件¶
关闭文件¶
End 补充¶
memcpy¶
将数组 a 中的元素全部复制到数组 b
sizeof(a) 返回 a 占用的空间,字节数 \(\times\) 元素数