uint8_t的C-1维数组实际上是2维数组?

标签 c multidimensional-array uint8t

好吧,我在大学类(class)中对 C 知之甚少,所以我希望你能理解我的问题。 我在 Android 上使用 FFmpeg 库,所以我只需要了解他们的 C 代码中的一些内容。

所以, 我有这个结构:

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
    /**
     * pointer to the picture/channel planes.

     */
    uint8_t *data[AV_NUM_DATA_POINTERS];

  .......(some more types)
}

仅此而已, 但是当我查看其他文件中的函数时,我看到下一行,并且感到困惑,

函数外:

static AVFrame  *picture_hq;

以及函数内部:

picture_hq->data[0][y * picture_hq->linesize[0] + x] = native_video_frame_data[0];

不要关注未知的论点, 我只是不明白上面结构中的一维数组 data[] 如何变成二维数组 data[0][bla bla bla..]?

与uint8_t类型有关吗?

最佳答案

数据数组不是一个包含 8 个 uint_8 的数组,而是一个包含 8 个指向 uint_8 的指针的数组。 请注意数据前面的星号。 - 类型为 uint8_t* - 即指向 uint8_t 的指针

uint8_t *data[AV_NUM_DATA_POINTERS];

在 C 语言中,数组类似于指针,因此如果您有一个指向 uint8_t 的指针,则可以以数组的形式访问它指向的地址以及后续地址。

您确实需要正确分配此数据,否则您将收到段错误或一些您不期望的数据 - 但这可能由您的库正确处理。

C 还对指针使用特殊算术(指针算术) - 因此指针的类型决定了元素之间的“间距” - 因此,如果您有一个指向 uint8_t 的指针,则将处理数组元素,每个元素为 1 个字节以前的。如果类型为 uint32_t,则每个元素将距离前一个元素 4 个字节 - 以适应更大的类型。

您可以在此处找到有关 C 数组和指针算术的更多信息:

C arrays and pointer arithmetic

因此,由于 data[] 是指向 uint8_t 的指针数组,因此 data[0] 是指向 uint8_t 的指针。 由于您可以将此指针视为 uint8_t 数组的开头,因此

picture_hq->data[0][y * picture_hq->linesize[0] + x] = native_video_frame_data[0];

访问 data[0] 指向的地址的 (y * picture_hq->linesize[0] + x) 偏移量,并将其视为 uint8_t。

关于uint8_t的C-1维数组实际上是2维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507977/

相关文章:

c - 如何在c中的char数组中复制uint8_t数组

c++ - 是否可以检查变量的存在?

c++ - 为什么不能像这样复制 char 数组 charArray ="some string";

java - 在for循环中匹配两个char类型数组,for循环无法正确执行

java - 在java中的二维字符数组中查找单词。如果某些部分没有被注释掉,为什么我会遇到搜索问题?

c - 如何打印 uint8_t 字节数组?

c - 二叉搜索树输出文件不是预期的输出数据

c - 如何区分 char 数据类型有符号或无符号?

java - 尝试创建一个对象数组,数组的长度和数组中的对象均由用户确定

c++ - 使用 gcc 和 termios 将 uint8_t 数组传递给 Arduino