转换回二维数组

Casting Back to a 2-Dimensional Array

本文关键字:二维数组 转换      更新时间:2023-10-16

给定:

void foo(int[][3]);
int* bar();

以及bar通过从二维数组(子数组大小为 3(reinterpret_cast返回int*的信息。

我想将这些映射在一起。我知道我可以做到:foo(reinterpret_cast<int (*) [3]>(bar()))但我不太确定(*)是什么意思.为什么我不能只做其中之一?

  1. foo(reinterpret_cast<int* [3]>(bar()))
  2. foo(reinterpret_cast<int[][3]>(bar()))

有人可以解释一下这种神秘的语法是什么意思以及为什么我不能使用12代替吗?

foo(reinterpret_cast<int* [3]>(bar()))

foo(reinterpret_cast<int (*) [3]>(bar()))

前者是将bar投射到一个由 3 个"int指针"组成的数组中。
后者bar转换为指向"3ints"数组的指针。这是非常不同的。

至于为什么你不能在reinterpret_cast中使用int[][3]作为类型,我不确定为什么会这样。语言律师将能够回答这个问题。

解析 C 声明有左右规则:

"左右"规则是破译 C 的完全常规规则 声明。 它在创建它们时也很有用。

首先,符号。 读

*     as "pointer to"         - always on the left side
&     as "reference to"       - always on the left side
[]    as "array of"           - always on the right side
()    as "function returning" - always on the right side

正如您在声明中遇到它们时。

步骤 1

查找标识符。 这是你的起点。 然后对自己说, "是。" 您已经开始声明。

步骤 2

查看标识符右侧的符号。 例如,如果您找到"((" 在那里,您就知道这是一个函数的声明。 所以你 然后会有"标识符是函数返回"。 或者,如果您发现 "[]"在那里,你会说"标识符是数组"。 继续向右,直到 您用完了符号点击括号"("。 (如果您点击 左括号,这是 (( 符号的开头,即使有 是括号中的东西。 更多内容见下文。

步骤 3

查看标识符左侧的符号。 如果它不是我们的 上面的符号(比如"int"之类的东西(,就说出来。 否则,请翻译 它使用上面的表格翻译成英语。 继续向左走,直到用完 符号点击括号"("。

现在重复步骤 2 和 3,直到形成声明。