2017-02-19 123 views
4

我有点转身在这样做的确切语法。我有一个数组定义为这样:C数组的const无符号字符[] []

const unsigned char ARR[SIZE][SIZE] = {...} 

,我希望把它在一个数组,所以我可以做一些我已经试过const unsigned char ARR2[][SIZE][SIZE] = {ARR}const unsigned char* ARR2[SIZE][SIZE] = {ARR},但既不是

ARR2[0] = ARR 

效果那些工作。有人可以指出正确的语法是否有一个常数二维无符号字符数组的常量数组?

+0

目前还不清楚你试图达到的目标:你可以在你试图使用'ARR'和这个'ARR2' thingy的地方发布代码吗? – chqrlie

+0

你的意思是你想要一个'[SIZE] [SIZE]'数组的数组,或者一个指向'[SIZE] [SIZE]'数组的指针数组? – Dolda2000

+0

换句话说,你打算让'ARR2 [0]'指向'ARR',还是本身就是一个用'ARR'的内容初始化的数组? – Dolda2000

回答

2

从到haccks的回答您的意见,这听起来像你想的:

const unsigned char ARR[SIZE][SIZE] = {...}; 
const unsigned char (*ARR2[])[SIZE][SIZE] = {&ARR}; 

如果你想ARR2自己是const,这将是这样的:

const unsigned char (* const ARR2[])[SIZE][SIZE] = {&ARR}; 

它应该也许还要注意的是,你不能使用这种憎恶来访问ARR[x][y]作为ARR2[0][x][y],但需要做(*ARR2[0])[x][y](或者等效地,ARR2[0][0][x][y])。

可能值得注意的另一个必然结论是,您不能指定ARR2ARR2[0] = ARR,但您需要明确地做ARR2[0] = &ARR(至少为了避免警告)。其原因是,ARR退化为一个指针到其第一元件,也就是一个const unsigned char *其值是&ARR[0][0],而ARR2[0]期望被分配const unsigned char (*)[SIZE][SIZE],其与&ARR获得。尽管两种情况下指针值都是相同的,但类型不是。

+0

这在技术上是正确的,但似乎领先于OPs技能水平。事实上,它看起来像一个编译器一致性测试。 – chqrlie

+0

是的,当我开始写ARR2时,我意识到它会变得有点混乱。我需要有一个数组数组,并且出于可移植性的原因需要每个数组都有自己的头文件。 我明白这里发生了什么;我想我错误的印象是,任何时候你使用一个数组,它都被转换为一个引用。 – user2752635

+1

@ user2752635:不确定,但是从您对Sergio的回答的评论中,它听起来像您可能错误地认为变量初始化与变量赋值相同(或至少类似于)变量赋值,这可能离真相。 – Dolda2000

-1

试试这个

const unsigned char (* ARR2)[SIZE] = ARR; 

您在您的评论中提到要ARR2是可以容纳阵列ARR,因为它是第一个元素的数组,但这是不可能的ARR是一个数组,当它是一元运算符&sizeof的操作数时,它将转换为它的第一个元素的指针。

+1

我不想有一个指向ARR的指针。我想要一个数组,其中第一个索引指向ARR。 – user2752635

+1

@ user2752635;更新了答案。 – haccks

1

看起来像你试图实现的是不可能的,因为赋值运算符的左操作数只能是算术,结构/联合或指针类型,而不是数组。详情请看这里:6.5.16.1 Simple assignment

所以唯一的办法是你只有memcpy()'ing。

+0

我不明白。 'const unsigned char ARR [SIZE] [SIZE] = {...}'编译好。我可以在我的代码中使用ARR。设置一个等于某事的数组不是问题,问题在于键入。 这可能是gcc的一个功能,但我可以肯定地初始化一个数组。 – user2752635

相关问题