通过二维数组列是必需的

时间:2013-03-15 14:35:39

标签: c++ arrays function

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

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

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

4 个答案:

答案 0 :(得分:2)

如果没有指定第二个维度,则无法传递2D数组,否则,参数“a”将衰减为指针,编译器需要知道第二个维度计算偏移的时间长度(原因是2D数组是在内存中存储为1D)。因此,编译器必须知道* a的大小,这需要给出第二维。您可以使用向量向量来替换2D数组。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

C样式数组不像您想象的那样工作。将它们视为一块内存,尺寸告诉编译器偏离原始地址的距离。

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

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

另一方面,

int a[][]是一个不完整的类型,所以对于编译器来说,[2] [1]是*(a + 2*?? + 1),谁知道什么?装置

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

正如一些人所说,使用STL,而是使用向量。使用std::vector<std::vector<int> > a非常安全。你仍然可以得到[2] [1]。

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

答案 3 :(得分:0)

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

  

address_of_a +(X * SECOND_SIZE + y)的

现在想象你想要

  

A [2] [3]

编译器必须计算:

  

address_of_a +(2 * SECOND_SIZE + 3)

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

see more here