在传递二维数组时,我们必须指定该列。 例如:
void funtion1(a[])// works
{
}
void function2(a[][4])//works
{
}
void function3(a[][])//doesn't work
{
}
function3
被视为错误定义的可能原因是什么?
是否有不同的方法来定义function3
,以便我们可以将行和列留空。
阅读一些回复:
你能解释一下x[n]
和x[]
的不同之处吗?我猜前者代表一个特定的数组位置而后者是未指定的数组。更多解释将深表赞赏。
答案 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],因此编译器必须知道如何计算这些对象的地址。