C++ 回溯到二维数组

C++ 回溯到二维数组,c++,arrays,pointers,multidimensional-array,reinterpret-cast,C++,Arrays,Pointers,Multidimensional Array,Reinterpret Cast,鉴于: 以及通过从二维数组(子数组大小为3)重新解释强制转换返回int*的bar信息 我想把这些画在一起。我知道我能做到:foo(reinterpret\u cast(bar()),但我不太确定(*)是什么意思。为什么我不能做一个呢 foo(重新解释cast(bar()) foo(重新解释cast(bar()) 有人能解释一下这个神秘的语法是什么意思,以及为什么我不能用1或2来代替吗?解析C声明的方法有: “右-左”规则是破译C的完全规则规则 声明。它在创建它们时也很有用 首先是符号。阅读 vo

鉴于:

以及通过从二维数组(子数组大小为3)重新解释强制转换
返回
int*
bar
信息

我想把这些画在一起。我知道我能做到:
foo(reinterpret\u cast(bar())
,但我不太确定
(*)
是什么意思。为什么我不能做一个呢

  • foo(重新解释cast(bar())
  • foo(重新解释cast(bar())
  • 有人能解释一下这个神秘的语法是什么意思,以及为什么我不能用1或2来代替吗?

    解析C声明的方法有:

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

    首先是符号。阅读

    void foo(int[][3]);
    int* bar();
    
    当你在声明中遇到他们时

    步骤1

    查找标识符。这是你的出发点。然后对自己说, “标识符为。”您已开始声明

    步骤2

    查看标识符右侧的符号。比如说,如果你发现“()” 这样,您就知道这是一个函数的声明。那么你呢 然后会有“标识符是函数返回的”。或者如果你找到一个 “[]”在这里,您会说“标识符是的数组”。一直走到 符号用完或右括号中出现“)”。(如果你撞到了一个 左括号是()符号的开头,即使有 括号中的内容。下面将详细介绍。)

    步骤3

    查看标识符左侧的符号。如果不是我们的 上面的符号(比如,类似“int”的东西),就说出来吧。否则,请翻译 用上表把它翻译成英语。一直向左走,直到你的车用完为止 符号或点击左括号“(”

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

    foo(重新解释cast(bar())
    
    不一样

    foo(reinterpret_cast<int* [3]>(bar()))
    
    foo(重新解释cast(bar())
    
    前者将
    转换为3个“
    int
    指针的数组。”
    后者将
    bar
    转换为指向“3
    int
    s”数组的指针,这是非常不同的


    至于为什么你不能用
    int[][3]
    作为
    reinterpret\u cast
    中的一种类型,我不确定为什么会是这样。语言律师可以回答这个问题。

    如果你能在所讨论的:
    int(*)[3]
    中演示这条规则的使用,对我来说会更有帮助。@JonathanMee in
    int(*p)[3]
    p
    是指向3个整数数组的指针。在强制转换中,您不需要标识符
    p
    foo(reinterpret_cast<int* [3]>(bar()))
    
    foo(reinterpret_cast<int (*) [3]>(bar()))