如何在C中的变量中存储多维数组?

Mar*_*eIV 0 c arrays types reference

我们有以下两个静态定义的字节数组......

unsigned char pixelBuffer1[32][6] = {/**/};
unsigned char pixelBuffer2[32][6] = {/**/};
Run Code Online (Sandbox Code Playgroud)

我们想将当前缓冲区存储在变量中,但我们不确定如何声明它.这就是我们想要做的......

[SOMETYPE] activePixelBuffer;

activeBufferId == getOneOrTwoBasedOnSomeLogic();
activePixelBuffer = (activeBufferId == 1)
    ? pixelBuffer1
    : pixelBuffer2;

activePixelBuffer[17][4] = x;

activeBufferId == getOneOrTwoBasedOnSomeLogic();
activePixelBuffer = (activeBufferId == 1)
    ? pixelBuffer1
    : pixelBuffer2;

activePixelBuffer[23][2] = y;
Run Code Online (Sandbox Code Playgroud)

(注意我们在整个代码中重新分配activePixelBuffer的值)但是,我们不确定要输入什么 [SOMETYPE]

我知道如果我们将pixelBuffer1或pixelBuffer2传递给一个函数,我们会像这样定义它...

void someFunc(unsigned char (&myArray)[32][6])
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

...但这似乎不能作为局部变量声明类型.此外,这迫使我们硬编码维度大小,这是好的,但不必这样做是很好的.

我们也尝试过使用指针,但阵列的二维方面也让我们失望.

那么我们用什么类型?

Pau*_*l R 7

使用typedef:

typedef unsigned char PixelBuffer[32][6];      // NB: SPOT principle, aka DRY!

PixelBuffer pixelBuffer1 = { ... };
PixelBuffer pixelBuffer2 = { ... };
PixelBuffer *activePixelBuffer = (activeBufferId == 1) ? &pixelBuffer1 :
                                                         &pixelBuffer2;

(*activePixelBuffer)[17][4] = x;
Run Code Online (Sandbox Code Playgroud)

请注意,除了使语法更清晰之外,这也是SPOT(单点真相)原则的一个例子,又称DRY(不要重复自己) - 你的2D数组类型应该只被定义一次 - 没有复制和粘贴unsigned char foo[32][6]!