添加链表节点
1.数据域初始化
2.将要插入的节点链接到链表上
3.重新更改指针的指向
栈:
局部变量,程序运行期间的变量分配大部分是在栈空间分配,函数结束后,系统自动回收资源,空间比较小,先进后出
堆:
堆空间比较大,由程序员自由支配,只能手动申请和释放,
malloc:申请的空间在堆上!
malloc和free要成对出现,防止出现堆空间不足的现象,即申请的空间要释放,存在堆空间的数据不会随函数结束而自动释放。指针存储于堆。后进先出
断错误:
指针:
常量指针/NULL/野指针
数组:
数组的越界访问,访问到非法区域或者修改了其它变量
其它:
内存不足
双释放
内存泄漏
栈和队列
栈:先进后出,后进先出
压栈:push()
出栈:pop()
每压入一个元素,top指针向上移动一位(当top处于栈顶时满栈/栈底时空栈) 头插头删
队列:先进先出,后进后出,
尾插头删
宏
define LEN sizeof(STU)
宏后面一般不加分号
undef LEN
取消宏定义
条件预编译
测试代码段
#if :表达式0/1//非零为真,则执行
#elif
#else
#endif
gcc 的编译细节
预处理
gcc -E
.i 目标文件去除注释,宏
编译
gcc -S
.s 汇编语言
汇编
gcc -C
.o 01指令,不可执行
链接---库文件
将多个目标文件组织为可执行程序 01程序
文件
-:普通文件
d:目录文件
l:链接文件
p:管道文件
b:块设备文件
c:字符文件
perror
(1)文件系统
文件信息:索引节点(index)
文件操作:文件描述符(fd)
文件描述符的fd最大值
早期的Unix系统 1024
Linux系统: 65535
(2)文件的定义
一组相关数据的有序集合,称为文件。
(3)文件的打开和关闭
打开:fopen(文件名,属性);
关闭:fclose(文件指针);
文件使用完成后要关闭,否则会造成文件数据丢失,内存混乱。
文件指针
文件指针结构体:FILE -------->#include<stdio.h>
包含了文件的基本信息
FILE *指针变量名;
文件名可以是存在,也可不存在,视属性而定,文件名可以加路径
属性:
读 r 写 w 追加 a
+:可读写
t:文本文件
b:二进制文件
rt, wt, at, rb, wb, ab, rt+, wt+, at+, rb+, wb+, at+,
rt+/wt+:可读写
rt/rb:可读
wt/wb:只写,带w属性的,可以写文件,若文件已存在,则清除文件重新写;若不存在,则以给定文件名创建文件;
r:带r属性的,文件必须存在!!
(4)文件的操作
fgetc()/fputc():字符读写函数
fgets()/fputs():字符串读写函数
fscanf()/fprintf():格式化读写函数*****
fread()/fweite():块读写函数*****
注:
在C89标准中,fread()/fwrite()有BUG!!
文件结束标志:EOF(end of file)
5.fgetc()/fputc()
fgetc(文件指针)://从给定文件中读取一个字符
fputc(字符,文件指针)://添加一个字符到指定文件中
fgets()/fputs()
fgets(字符数组/字符串常量/指针,size,fp);
从文件fp中获取字符串,获得size-1个长度,在末尾加'\0'
碰到EOF或者换行符结束
fputs(字符数组/字符串常量/指针,fp)
stdin: 标准输入-------》键盘
stdout: 标准输出-------》终端
stderr: 错误输出-------》终端
fseek(文件指针,位移量(long型L结尾),起始点)
fscanf(fp,"格式",参数列表);//按格式写文件
<----------------
fprintf(fp,"格式",参数列表);//按格式读文件
-------------------->
fread()/fwrite()//块读写文件
fread(address,size,count,fp);//读
<---------------
fwrite(address,size,count,fp);//写
------------------>
address:地址
size:大小---->sizeof()/或者具体数值
count:读写的块数(默认为1)
fp:文件指针