【问题标题】:Passing a 2-D array the column is mandatory传递二维数组,该列是强制性的
【发布时间】:2013-03-15 14:35:38
【问题描述】:

在传递二维数组时,我们必须指定列。 例如:

void funtion1(a[])// works
{
}
void function2(a[][4])//works
{
}
void function3(a[][])//doesn't work
{
}

function3 被视为错误定义的可能原因是什么。 是否有不同的方法来定义function3,以便我们可以将行和列都留空。 阅读一些回复: 你能解释一下x[n]x[] 有什么不同吗?我猜前者代表一个特定的数组位置,后者是未指定的数组。更多解释将不胜感激。

【问题讨论】:

  • 是的,它叫std::vector
  • 你为什么要传递数据?
  • boost::multi_array 可能也适合您。
  • x[]x[n] 在 C 中是根本不同的东西。解释为什么不是一个问题的主题,而是一本关于 C 的好书中的一章。在 C++ 中,两者都是高级主题,应该隐藏在库代码深处。
  • 如果您查看this question,几乎曾经 可以回答有关 C 或 C++ 中基本数组的问题。我建议你这样做。不久前,我几乎回答了这个same question,以防你从第一个答案中没有得到足够的轰炸。

标签: c++ arrays function


【解决方案1】:

你不能在不指定第二维的情况下传递二维数组,否则参数“a”将衰减为指针,编译器需要知道第二维是多长时间来计算偏移量(原因是二维数组是在内存中存储为一维)。因此,编译器必须知道 *a 的大小,这就要求给出第二维。您可以使用向量的向量来替换二维数组。

【讨论】:

    【解决方案2】:

    void function2(a[][4]) 它知道每行有 4 个元素。对于void function3(a[][]),它不知道,所以它无法计算a[i] 应该在哪里。
    使用向量,因为它是 c++

    【讨论】:

      【解决方案3】:

      C 风格的数组不像你想象的那样工作。把它们想象成一块内存,尺寸告诉编译器从原始地址偏移多远。

      int a[] 基本上是一个指针,每个元素都是一个 int,这意味着 a[1] 等价于 *(a + 1),其中每个 1 是 sizeof(int) 个字节。 a 数组没有限制或结束(简单地说)。你可以使用 a[999999] 编译器不会在意。

      int a[][4] 类似,但现在编译器知道每一行都是 4*sizeof(int)。所以 a[2][1] 是*(a + 2*4 + 1)

      另一方面,int a[][] 是一个不完整的类型,所以对于编译器来说,a[2][1] 是*(a + 2*?? + 1),谁知道呢?意思。

      不要使用int **a,这意味着一个指针数组,这很可能是你不想要的。

      正如一些人所说,对于 STL,使用向量代替。使用std::vector<std::vector<int> > a 非常安全。您仍然可以获得 [2][1]。

      当您使用它时,请改用引用,const std::vector<std::vector<int> > &a。这样,您就不会在每个函数调用中复制整个数组。

      【讨论】:

        【解决方案4】:

        编译器如何计算 a[x][y] 的地址? 很简单:

        address_of_a+(x*SECOND_SIZE+y)

        现在想像你想要的

        一个[2][3]

        编译器必须计算:

        address_of_a+(2*SECOND_SIZE+3)

        如果编译器不知道 SECOND_SIZE 它如何计算它? 你必须明确地给他。您在代码中使用 a[2][1], a[100][13],因此编译器必须知道如何计算这些对象的地址。

        see more here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-20
          • 2013-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-07
          相关资源
          最近更新 更多