变量与常量
int a=10;//变量,可在赋值
const int a=10;//常量,不可再赋值
指针与数组
指针就是内存地址:void、char
数组 如:char c[2]、int arr[10]
指针的物理意义
它就是内存中的一个地址
指针本身运算
指针所指内容的操作
操作系统是如何管理内存的
栈空间:将一个方法中所有参数,局部变量压入栈空间,方法退出将栈空间的内容全部清空(一般在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文件,其实是一个中间文件,可执行程序的一部分,并不是最终拿去执行的文件)
链接,动态链接/静态链接(静态链接:将系统库、三方库与我们编译好的代码链接到一起,形成一个包含所有资源的文件。动态链接:系统库、三方库在指定位置,在需要使用到该库时,直接跳转到共享位置,执行该库就可以了;即在代码运行过程中进行链接)