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

时间:2014-06-20 06:59:55

标签: c arrays types reference

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

unsigned char pixelBuffer1[32][6] = {/**/};
unsigned char pixelBuffer2[32][6] = {/**/};

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

[SOMETYPE] activePixelBuffer;

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

activePixelBuffer[17][4] = x;

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

activePixelBuffer[23][2] = y;

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

输入什么

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

void someFunc(unsigned char (&myArray)[32][6])
{
    ...
}

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

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

那么我们对该类型使用了什么?

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:1)

对数组的引用在C ++中起作用:

int activeBufferId = 1;
unsigned char pixelBuffer1[32][6] = {/**/};
unsigned char pixelBuffer2[32][6] = {/**/};
unsigned char (&activePixelBuffer)[32][6] = (activeBufferId == 1) ? pixelBuffer1 : pixelBuffer2;

activePixelBuffer[17][4] = '*';

在C中,你必须使用指针:

unsigned char (*activePixelBuffer)[32][6] = (activeBufferId == 1) ? &pixelBuffer1 : &pixelBuffer2;

(*activePixelBuffer)[17][4] = '*';
activePixelBuffer = &pixelBuffer2; // reassign the pointer to point to the other C-array.

无论如何,为了简化语法和可读性,我建议将这个数组移到struct / class中,这样你就必须使用类的引用/指针。

typedef struct PixelData { unsigned char buffer[32][6] } PixelData;

PixelData pixelData1 = {/**/};
PixelData pixelData2 = {/**/};
PixelData *activePixelData = (activeBufferId == 1) ? &pixelData1 : &pixelData2;