好吧,我在大学类(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/