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

如何在C中的变量中存储多维数组?,c,arrays,types,reference,C,Arrays,Types,Reference,我们有以下两个静态定义的字节数组 unsigned char pixelBuffer1[32][6] = {/**/}; unsigned char pixelBuffer2[32][6] = {/**/}; 我们希望将当前缓冲区存储在变量中,但不确定如何声明它。这就是我们想要做的 [SOMETYPE] activePixelBuffer; activeBufferId == getOneOrTwoBasedOnSomeLogic(); activePixelBuffer = (active

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

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的值 但是,我们不确定[某种类型]的输入内容

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

void someFunc(unsigned char (&myArray)[32][6])
{
    ...
}
…但这似乎不是局部变量声明类型。此外,这迫使我们硬编码维度大小,这是可以的,但最好不要这样做

我们也尝试过使用指针,但数组的二维特性也让我们感到困惑

那么我们用什么来表示类型呢?

使用typedef:


请注意,除了使语法更清晰外,这也是SPOT单点真值原则的一个示例,即不要重复自己-2D数组类型只应定义一次-不复制和粘贴未签名的char foo[32][6]

对数组的引用在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/类中,因此您只需要使用类的引用/指针

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

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

无符号的char *MyRoad应该工作。使用TyPulf-它使这样的事情变得简单很多。@ LevtTurkUs:不,它真的不起作用。char *不等于char [] [unchalchar & yMalStudi[32 ] [6 ]不是C++语法吗?嗯,是的,我不知怎么想,它们是字符串……MarquelV:你也可以尝试把它变成一个无符号的char MyLaStand,然后用MyLax[x+y*Wield]访问它,但是在C++的答案中,你如何在以后重新分配ActudiPxelBuffe?我正在更新我的问题,因为根据您的回答,我显然不清楚我们在追求什么。作为任何引用,您不能重新分配引用以指向其他变量。当您希望能够指向其他变量时,必须使用指针;我本来打算给你一个完整的答案和你的最后一个答案,这几乎是我们想要的,但是我不得不给另一个答案,因为他们也使用了typedef,但不需要使用structs来实现同样的功能。不过,我只是想让你知道你的答案也很好。第一行的评论是什么意思?i、 e.NB:SPOT等。你确定那里有PixelBuffer1而不仅仅是PixelBuffer吗?对C/C++来说也是新的,但我认为如果你引用的数组没有维度,你就不需要地址和操作符,因为这是你得到的。。。或者你是说你想要指向数组的变量的地址,而不是数组本身的地址?我有一种感觉是latter@MarqueIV:您确定要使用PixelBuffer1。。。你说得对,保罗·R自己也被臭名昭著的复制/粘贴编程习惯绊倒了…;-“已经更正了。@MarqueIV:我添加了一段解释SPOT/DRY以及为什么这是个好主意的内容。”。至于&dereference-PixelBuffer是作为2D数组类型定义的,而activePixelBuffer是指向PixelBuffer的指针,因此在为指针赋值时需要一个&MarqueIV:SPOT也称为SSOT。为了完整起见,这里还对DRY原则进行了解释:
typedef struct PixelData { unsigned char buffer[32][6] } PixelData;

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