[TOC]
C语言
1. 编译&执行C程序
1 | gcc hello.c |
错误:
1 | linker command failed with exit code 1 (use -v to see invocation) |
数组
数组的以第一个值的地址,作为数组本身的地址;
指针
int *p; 指针
int *p = NULL; C中的NULL指针,值是一个良好的编程习惯;被称为空指针
可以用if来进行判断
if(p) 如果非空,则完成
if(!p) 如果p为空,则完成函数指针 int (*p)(int,int) = &max; 指针要带括号 (*pMethod)
1
2
3
4
5
6
7
8
9
10
11
12
13int max(int a, int b) {
return 10;
}
int main() {
//定义
int (*pMethod)(int, int) =&max;
//使用
int p = pMethod(1,2); //相当于 max(1,2)
printf("%d", p);
}回调函数
1
2
3
4
5void fun(int index, int (*pMethod)(int, int)) {
for (int i = 0; i < index; ++i) {
printf("%d \n", pMethod(2, 1));
}
}
结构体
1
2
3
4struct NODE {
int value;
struct NODE *next;
};//结构体获取数据
1
2
3
4
5struct NODE *node;
node -> value;
struct NODE node2;
node2.value;结构体,共用体有什么区别
结构体创建的时候为什么要用* 指针共用体,union
typeof:它来为类型取一个新的名字
#define是c指令,各种数据类型定义别名
HelloWorld
字符数组
1 | int main(int argc, char* argv[]) { |
编译 clang -g -o helloworld helloword.c
基本数据类型
Short 16位 int 32位 long 32位
float 32位 double 32位 浮点型影响计算速度
char
void void* 代表指针类型
变量和常量 这个里面讲了c语言的内存模型
变量:在内存中随时发生变化的
常量:const int len = 256 //常量定义
Malloc 和 new申请的区域
临时变量是在栈空间的
指针与数组
内存地址 void* ,char*
常见的char* 字符串首地址,
void*不关注内容,只关注地址
数组:如:char[2] , int arr[10] 连续的,同一类型的空间
就是地址中转,可能是普通的数值
任何一个变量都有自己的一个地址的
1 |
|
结构体
struct : 和类有点相似,就是没成员方法;
相当于自定义类型,要写全
1 | typedef struct NODE { |
枚举
枚举使用后,只能用枚举内部的值
1 | typedef enum aaaa{ |
算术运算 +-*/ %
for 和 while
函数:
最终的实现,都是函数堆积完成的,
函数尽量不超过100行,如果需要一些效率可能会有些变化
1 | void func(int a) {} |
c语言中的文件操作
FILE* file;
FILE* fopen(path, mode);
fclose(FILE* file);
再论指针
指针的物理意义,它就是相当于门牌号
指针本身可以进行运算的,可以通过计算获取到新的值
指针指的内容可以运算可以取值,可以吧
栈空间:操作系统自动分配的
堆空间
内存空间
void* mem = malloc(size);
free(mem) //不用的时候要成对的释放
内存泄漏与野指针
不断的向系统申请内存。
申请的内存不用,也不释放。
占用别人的内存称为野指针(就是已经调用了释放free指针,然后就应该不要再用了,再用就出错)
1 | //CDemo1(24412,0x10fc0f5c0) malloc: *** error for object 0x7fb3e2c02b30: pointer being freed //was not allocated |
函数指针
返回值类型(*指针变量名)(参数列表)
函数指针
fun() {
}
Gcc/glong
Gcc/clang -g -O2 -o test tes.c -I… -L…. -l
-g 输出文件中的调试信息
-O:对输出文件做指令优化
-o: 输出文件
-I:大写的i,指定头文件位置
-L: 指定库文件位置
-l:小写的L,指定哪个库
编译过程
预编译:头文件个文件编译在一起
编译:
链接,动态链接/静态链接 和其他库链接在一起
代码执行过程中,链接是动态链接,
#inculde “” 双引号,优先本地查找
-l默认没有 lib
调试器原理:
编译输出带调试信息的程序
调试形象包含:指令地址,对源代码及行号
指定完成后,回调
gdb/lldb
break list看多少断点
Clang -g -c test.c 这个生成的是不能进行调试的
clang -g test.c 这个才能进行调试
ffmpeg从何而来
2000年
2011 Libav 从FFmpeg中分离出来的
H264 h265的api
ffmpeg 开源代码
libavutil 常用的工具
Libavformat 多媒体格式的解析和封装
libavcodec 所有音频编解码
Libavdevice 对设备
Libavresample 对音频重采样
libavfilter 所有的视频后处理,滤镜
libswresample
Libswscale
Share 文档和例子
include 头文件
bin 生成的所有的程序
ffmpeg
ffplay
ffprobe
lib : 生成的动态库, mac dylib,liunx是.so