C,C++基础

[TOC]

C语言

1. 编译&执行C程序

1
2
3
4
5
6
gcc hello.c
./a.out


gcc hello.c hello2.c -o main.out
./main.out

错误:

1
2
linker command failed with exit code 1 (use -v to see invocation)
这个错误是因为我弄了2个main方法,然后就执行失败出现了这个问题
  1. 数组

    数组的以第一个值的地址,作为数组本身的地址;

  2. 指针

    int *p; 指针

    int *p = NULL; C中的NULL指针,值是一个良好的编程习惯;被称为空指针

    可以用if来进行判断
    if(p) 如果非空,则完成
    if(!p) 如果p为空,则完成

  3. 函数指针 int (*p)(int,int) = &max; 指针要带括号 (*pMethod)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int 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
    5
    void fun(int index, int (*pMethod)(int, int)) {
    for (int i = 0; i < index; ++i) {
    printf("%d \n", pMethod(2, 1));
    }
    }
  1. 结构体

    1
    2
    3
    4
    struct NODE {
    int value;
    struct NODE *next;
    };

    //结构体获取数据

    1
    2
    3
    4
    5
    struct NODE *node;
    node -> value;

    struct NODE node2;
    node2.value;

    结构体,共用体有什么区别
    结构体创建的时候为什么要用* 指针

  2. 共用体,union

  3. typeof:它来为类型取一个新的名字

  4. #define是c指令,各种数据类型定义别名

HelloWorld

字符数组

1
2
3
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
2
3
4
5
6
7
8
9
10
11
12

int *a, *b;

a = (int *) malloc(sizeof(int));
b = (int *) malloc(sizeof(int));

//一维数组申请
int *d;
d = (int *) malloc(sizeof(int) * 3);

int **f;
f = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行

结构体

struct : 和类有点相似,就是没成员方法;

相当于自定义类型,要写全

1
2
3
4
typedef struct NODE {
int value;
struct NODE *next;
} Node;

枚举

枚举使用后,只能用枚举内部的值

1
2
3
typedef enum aaaa{
MON, STU
} eum;

算术运算 +-*/ %

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//CDemo1(24412,0x10fc0f5c0) malloc: *** error for object 0x7fb3e2c02b30: pointer being freed //was not allocated
//CDemo1(24412,0x10fc0f5c0) malloc: *** set a breakpoint in malloc_error_break to debug
//这个就是典型的野指针出现错误

//解决三部曲
//1、定义指针时,把指针变量赋值成NULL
//2、释放内存是,先判断指针变量是否为NULL
//3、释放完内存后,把指针变量重新复制成NULL
#include <iostream>
int main() {
// std::cout << "Hello, World!" << std::endl;
char* p = NULL;
p = (char*)malloc(sizeof(100));
stpcpy(p, "sfasfasdf");
if (p != NULL) {
free(p);
p = NULL; //重新指向NULL就可以了,
}
if (p != NULL) {
free(p);
}
return 0;
}

函数指针

返回值类型(*指针变量名)(参数列表)

函数指针

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