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

时间:2013-10-22 02:24:10

标签: c multidimensional-array uint8t

好吧,我对C大学课程知之甚少,所以我希望你能理解我的问题。 即时通讯使用FFmpeg库为Android所以我只需要了解他们的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];

不要注意未知的论点, 我只是不明白上面结构中的1维数组数据[]如何成为2维数组数据[0] [bla bla bla ..]?

是否与uint8_t类型有关?

2 个答案:

答案 0 :(得分:0)

数据数组不是8 uint_8的数组,而是uint_8的8个指针的数组。 请注意数据前的asterik。 - 类型为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。

答案 1 :(得分:0)

阅读声明的方法是:

uint8_t *data[AV_NUM_DATA_POINTERS];
        ^   ^                    ^
        |   |                    |
        |  1. the identifier...  |
        |                        |
        |           2. ... is an array...
        |
  3. ...of pointers.

重要的是,数组下标运算符[]的优先级高于解除引用运算符*。因此,当编译器看到

data[1][2]

它将执行以下操作:

  1. 它会查找符号data。这有一个数组类型uint8_t *()[]

  2. 数组衰减指向第一个元素uint8_t **的指针

  3. 第一个数组下标运算符[1]通过对衰减指针执行指针运算来访问数组的第一个元素。它等同于*(data + 1),结果类型为uint8_t *

  4. 第二个数组下标运算符[2]对从数组*(*(data + 1) + 2)读取的指针执行相同操作,产生类型为uint8_t的结果