截屏2019-12-04下午8.05.23.png

变量与常量

int a=10;//变量,可在赋值
const int a=10;//常量,不可再赋值

指针与数组

指针就是内存地址:void、char
数组 如:char c[2]、int arr[10]

截屏2019-12-04下午8.23.05.png截屏2019-12-04下午8.23.46.png

指针的物理意义

它就是内存中的一个地址
指针本身运算
指针所指内容的操作

操作系统是如何管理内存的

栈空间:将一个方法中所有参数,局部变量压入栈空间,方法退出将栈空间的内容全部清空(一般在4M-8M)
堆空间:空间大,全局可用
内存映射:磁盘文件映射到内存里,修改内存中的内容磁盘文件也同时发生变化

内存分配与释放

栈空间:系统自动分配,进入函数系统自动分配空间,退出函数即释放
堆空间:
分配内存 void* men =malloc(size);
释放内存 free(men);

内存泄漏与野指针

内存泄漏:不断的向系统申请内存,申请的内存不用也不释放
野指针:占用别人的内存称为野指针(释放内存后,继续使用该指针,内存已经是别人的了)

函数指针

返回值类型 (指针变量名)([形参列表])
int func (int x);/
声明一个函数/
int (
f) (int x);/声明一个函数指针/
f=func;/将func函数的首地址赋给指针f /

c语言编译器

clang -g -O2 -o test test.c -I… -L… -l…
-g输出文件的调试信息
-O对输出文件做指令优化(2,代表优化级别;1可以看到变量名,2看不到变量名)
-o输出文件
-I指定头文件
-L指定库文件位置
-l指定使用哪个库

clang -g -c add.c
-c 对源代码进行编译
编译成add.o文件

libtool -static -o libmylib.a add.o
libtool 编译库工具
-static 编译成静态库
-o输出文件
libmylib.a lib为前缀,代表库,mylib为名字,因为是静态库所有后缀为.a

clang -g -O2 -o testlib testlib.c -I . -L . -lmylib (.代表在当前目录下查找,-lmylib 会自动加上前缀lib,查找libmylib库)

clang -g -O2 -o test test.c -I… pkg-config --libs libname (pkg-config —libs libname 可以代替 -L… -l… 查找到libname的路径)

编译过程

预编译(将头文件与我们源代码联合在一起生成一个新的文件)
编译(编译生成.o文件,其实是一个中间文件,可执行程序的一部分,并不是最终拿去执行的文件)
链接,动态链接/静态链接(静态链接:将系统库、三方库与我们编译好的代码链接到一起,形成一个包含所有资源的文件。动态链接:系统库、三方库在指定位置,在需要使用到该库时,直接跳转到共享位置,执行该库就可以了;即在代码运行过程中进行链接)

程序调试

截屏2019-12-05下午5.34.56.png

截屏2019-12-05下午5.34.17.png