1

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

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

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

4

4 回答 4

2

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

于 2013-03-15T14:40:14.850 回答
1

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

于 2013-03-15T14:42:27.563 回答
1

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. 这样,您就不会在每个函数调用中复制整个数组。

于 2013-03-15T15:16:28.830 回答
0

编译器如何计算 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],因此编译器必须知道如何计算这些对象的地址。

在这里查看更多

于 2013-03-15T15:17:29.497 回答