【问题标题】:C Array of const unsigned char[][]const unsigned char[][] 的 C 数组
【发布时间】:2017-02-19 16:36:04
【问题描述】:

我对执行此操作的确切语法有点转变。我有一个这样定义的数组:

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

我想把它放在一个数组中,这样我就可以做一些事情来实现

ARR2[0] = ARR

我尝试过const unsigned char ARR2[][SIZE][SIZE] = {ARR}const unsigned char* ARR2[SIZE][SIZE] = {ARR},但都没有奏效。有人能指出拥有无符号字符常量二维数组的常量数组的正确语法吗?

【问题讨论】:

  • 目前尚不清楚您要达到的目标:您能否发布您尝试使用ARR 和此ARR2 的代码?
  • 你的意思是你想要一个[SIZE][SIZE]数组的数组,还是一个指向[SIZE][SIZE]数组的指针数组?
  • 换句话说,你是想让ARR2[0]指向ARR,还是让它本身成为一个用ARR的内容初始化的数组?

标签: c arrays multidimensional-array constants


【解决方案1】:

从你的评论到黑客的回答,听起来你想要这个:

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 获得的。虽然指针值在两种情况下都是相同的,但类型却不同。

【讨论】:

  • 这在技术上是正确的,但似乎远远领先于 OP 的技能水平。事实上,它看起来像是一个编译器一致性测试。
  • 是的,当我开始编写 ARR2 时,我意识到它会有点混乱。我需要有一个数组数组,并且出于可移植性的原因,需要每个数组都有自己的头文件。我明白这里发生了什么;我想我的错误印象是,任何时候使用数组,它都会被转换为引用。
  • @user2752635:不确定,但从您对 Sergio 的回答的评论来看,听起来您可能误以为变量初始化与变量赋值相同(或至少相似),这可能与事实相去甚远。
【解决方案2】:

似乎你想要实现的目标是不可能的,因为赋值运算符的左操作数只能是算术、结构/联合或指针类型,但不能是数组类型。详情请看这里:6.5.16.1 Simple assignment

所以对你来说唯一的方法就是memcpy()'ing。

【讨论】:

  • 我不明白。 const unsigned char ARR[SIZE][SIZE] = {...} 编译得很好。我可以在我的代码中使用 ARR。将数组设置为等于某事不是问题,问题在于打字。这可能是 gcc 的一个特性,但我绝对可以这样初始化一个数组。
【解决方案3】:

试试这个

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

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

【讨论】:

  • 我不想有一个指向 ARR 的指针。我正在尝试创建一个数组,其中第一个索引指向 ARR。
  • @user2752635;更新了答案。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2012-04-15
相关资源
最近更新 更多