文章目录- I . 一维指针类型参数
- II . 二维指针类型参数
I . 一维指针类型参数
1 . 音视频流数据包获取 :
代码语言:javascript复制 //读取数据包
AVPacket *avPacket = av_packet_alloc();
av_read_frame(formatContext, avPacket);
① 创建并初始化结构体指针 : AVPacket *avPacket = av_packet_alloc() , 该结构体是一个一维指针 ;
② 读取数据包 : av_read_frame(formatContext, avPacket) , 读取音视频流中的数据包 , 并存放到 AVPacket *avPacket 指针指向的结构体中 ;
2 . av_read_frame 函数原型 :
代码语言:javascript复制int av_read_frame(AVFormatContext *s, AVPacket *pkt);
① 一维指针参数 : av_read_frame ( ) 方法 , 接收的 AVPacket *pkt 是一个一维指针参数 , AVPacket 是一个结构体 , AVPacket * 是结构体指针 , 该指针指向一个 AVPacket 结构体 ;
② 一维指针参数可操作内容分析 : 在 av_read_frame ( ) 方法内部是不能修改 AVPacket *pkt 参数的结构体指针的指向的 , 如果修改了 AVPacket *pkt 结构体指针的指向 , 对外部的已经初始化过的 AVPacket *avPacket = av_packet_alloc() 结构体指针是不能造成影响的 , 这种操作无意义 ;
③ 传入的一维指针要求 : 这种情况下传入的指针必须经过初始化才行 , 在方法中只修改指针指向结构体的元素的值 ;
3 . 原理分析 ( 修改一维指针值 ) :
① 传入副本 : 将 AVPacket *avPacket 作为参数传入 av_read_frame ( ) 方法 , 仅仅是将指针的一个副本传入了方法 ;
② 修改指针值无意义 : 对传入的 AVPacket *pkt 指针参数的地址进行修改没有意义 , 在方法中如果修改了传入的指针的地址 , 仅仅是将传入的副本的值改变了 , 之后的一系列修改都是针对一个副本的值进行的 ;
③ 不影响外部变量 : 函数作用于结束后 , 该副本的声明周期也就结束了 , 与外部的 AVPacket *avPacket 没有任何关系 ;
4 . 原理分析 ( 修改一维指针指向的结构体的内容 ) :
① 传入副本 : 将 AVPacket *avPacket 作为参数传入 av_read_frame ( ) 方法 , 传入该指针副本作为参数 ;
② 指向同一块内存 : 但是 AVPacket *avPacket 指针 , 与 AVPacket *pkt 副本参数指针 , 指向的内存是同一块内存 ;
③ 影响外部变量 : 如果使用 AVPacket *pkt 参数的一维指针 ( 副本值 ) 修改该内存中的值 , 那么该内存中的值会被改变 , 此时外部指针 AVPacket *avPacket 指针指向的内存的值也会被改变 ;
5 . 结论 :
① 一维指针参数 : 传入一维指针 , 只能修改指向的内存的内容 ; 修改一维指针本身指向无意义 ;
② 二维指针参数 : 传入 二维指针 , 只能修改一维指针 及 以下的内容 ; 修改二维指针本身指向无意义 ;
③ N 维指针参数 : 传入 N 维指针 , 只能修改 N - 1 维指针 及 以下的内容 , 修改 N 维指针内容 无意义 ;
II . 二维指针类型参数
1 . 打开音视频地址 :
代码语言:javascript复制AVFormatContext *formatContext = 0;
int open_result = avformat_open_input(&formatContext, dataSource, 0, 0);
① 未初始化的空指针 : AVFormatContext *formatContext 结构体指针没有进行初始化 , 是个空指针 ;
② 二维指针参数 : avformat_open_input ( ) 方法传入的是 AVFormatContext ** 二维指针参数 , 目的是为了在方法中对 AVFormatContext * 进行初始化 , 初始化完成后 , 在传递到函数外部使用 ;
2 . avformat_open_input ( ) 函数原型 :
代码语言:javascript复制int avformat_open_input(AVFormatContext **ps,
const char *url, AVInputFormat *fmt, AVDictionary **options);
这里我们只关心 AVFormatContext **ps 二维指针参数 ;
3 . 二维指针参数 : 此处传入二维指针参数 , 二维指针的指向是副本改变没有任何意义 , 该二维指针副本 AVFormatContext **ps 参数指向的是 AVFormatContext *formatContext 的一维指针变量地址 ( 二维指针 ) , 该二维指针地址不可修改 , 但是可以修改二维指针指向的一维指针的地址 , 即在方法中重新初始化一个 AVFormatContext *结构体指针变量 , 用该二维指针指向它 ,
4 . 外部的一维指针 : AVFormatContext *formatContext 是外部的 AVFormatContext 结构体指针 , 地址值为 A1 , 指向 AVFormatContext 结构体 ;
5 . 外部的一维指针所在的内存地址 : &formatContext 是二维指针地址值为 A2 , 指向 AVFormatContext *formatContext 一维指针的地址 A1 ( 存储的是指向的结构体地址 , 目前没有初始化是空指针 ) ;
6 . 方法内部修改二维指针指向的一维指针 : 在方法中需要创建并初始化 AVFormatContext 结构体 , 地址是 A11 , 将该地址赋值给 A2 指向的内存地址中 , 外部的 AVFormatContext *formatContext 一维指针地址就被修改成了 A11 ;
7 . 结论 : 传入二维指针参数 , 二维指针本身修改无意义 , 修改二维指针指向的一维指针 , 可以影响外部的一维指针 ;