C++ 必须向列传递二维数组
传递二维数组时,必须指定列的名称。 例如:C++ 必须向列传递二维数组,c++,arrays,function,C++,Arrays,Function,传递二维数组时,必须指定列的名称。 例如: 功能3被视为不正确定义的可能原因是什么。 是否有其他方法来定义函数3,以便我们可以将行和列都留空。 阅读一些答复: 你能解释一下x[n]和x[]有什么不同吗?。我猜前者代表一个特定的数组位置,而后者是未指定的数组。如能提供更多解释,我们将不胜感激 如果不指定第二个维度,则无法传递2D数组,因为否则,参数“a”将衰减为指针,编译器需要知道第二个维度要多长时间才能计算偏移量(原因是2D数组在内存中存储为1D)。因此,编译器必须知道*a的大小,这要求给定第二
功能3
被视为不正确定义的可能原因是什么。
是否有其他方法来定义函数3
,以便我们可以将行和列都留空。
阅读一些答复:
你能解释一下
x[n]
和x[]
有什么不同吗?。我猜前者代表一个特定的数组位置,而后者是未指定的数组。如能提供更多解释,我们将不胜感激 如果不指定第二个维度,则无法传递2D数组,因为否则,参数“a”将衰减为指针,编译器需要知道第二个维度要多长时间才能计算偏移量(原因是2D数组在内存中存储为1D)。因此,编译器必须知道*a的大小,这要求给定第二个维度。可以使用向量向量替换二维数组。如果不指定第二个维度,则无法传递二维数组,因为否则,参数“a”将衰减为指针,编译器需要知道第二个维度的长度以计算偏移量(原因是二维数组在内存中存储为1D)。因此,编译器必须知道*a的大小,这要求给定第二个维度。可以使用向量向量替换二维数组。使用无效函数2(a[][4])
它知道每行有4个元素。使用void函数3(a[]])
它不知道,因此无法计算a[i]
应该在哪里。使用向量,因为它是c++和
void function2(a[][4])
它知道每行有4个元素。使用void函数3(a[]])
它不知道,因此无法计算a[i]
应该在哪里。使用向量,因为它是c++c样式的数组,不能按您所想的方式工作。将它们视为一个内存块,维数告诉编译器与原始地址的偏移量有多远
inta[]
基本上是一个指针,每个元素都是一个int,这意味着a[1]相当于*(a+1)
,其中每个1都是sizeof(int)字节。a
数组没有限制或结束(简单地说)。您可以使用[9999999],编译器不会在意
inta[][4]
是类似的,但是现在编译器知道每行是4*sizeof(int)。所以a[2][1]是*(a+2*4+1)
另一方面,inta[][]
是一个不完整的类型,因此对于编译器来说,a[2][1]是*(a+2*??+1)
,谁知道呢??意味着
不要使用int**a
,这意味着一个指针数组,这很可能是您不想要的
正如一些人所说,对于STL,使用向量代替。使用std::vector a
非常安全。你仍然可以得到[2][1]
当你使用它时,用引用代替,
const std::vector&a
。这样,您就不会在每次函数调用时复制整个数组。C样式数组的工作方式与您想象的不同。将它们视为一个内存块,维数告诉编译器与原始地址的偏移量有多远
inta[]
基本上是一个指针,每个元素都是一个int,这意味着a[1]相当于*(a+1)
,其中每个1都是sizeof(int)字节。a
数组没有限制或结束(简单地说)。您可以使用[9999999],编译器不会在意
inta[][4]
是类似的,但是现在编译器知道每行是4*sizeof(int)。所以a[2][1]是*(a+2*4+1)
另一方面,inta[][]
是一个不完整的类型,因此对于编译器来说,a[2][1]是*(a+2*??+1)
,谁知道呢??意味着
不要使用int**a
,这意味着一个指针数组,这很可能是您不想要的
正如一些人所说,对于STL,使用向量代替。使用std::vector a
非常安全。你仍然可以得到[2][1]
当你使用它时,用引用代替,
const std::vector&a
。这样,您就不会在每次函数调用时复制整个数组。编译器如何计算[x][y]的地址?
很简单:
地址a+(x*秒大小+y)
现在想象一下你想要什么
a[2][3]
编译器必须计算:
地址为a+(2*秒大小+3)
如果编译器不知道秒大小,它如何计算?
你必须明确地告诉他。您在代码中使用了[2][1]、[100][13],因此编译器必须知道如何计算这些对象的地址
编译器如何计算[x][y]的地址? 很简单: 地址a+(x*秒大小+y) 现在想象一下你想要什么 a[2][3] 编译器必须计算: 地址为a+(2*秒大小+3) 如果编译器不知道秒大小,它如何计算? 你必须明确地告诉他。您在代码中使用了[2][1]、[100][13],因此编译器必须知道如何计算这些对象的地址
< /P> >它被称为代码> STD::向量<代码>。为什么代码> Boo::多数组> <代码>可能对你有用。<代码> x/[]>和<代码> x[n]< /代码>是C中根本不同的事情。解释为什么不是一个问题的主题,而是在一本关于C++中C.的好书的章节中,两者都是高级的主题,应该在图书馆代码中深藏不露。如果你复习,C或C++中基本的数组几乎总是可以回答的。我建议你这样做。不久前,我回答了这个问题,以防你从第一个答案中没有得到足够的轰击。是的,它叫
std::vector
。你为什么要传递数据?boost::multi_array
可能也适合你。x[]
和x[n]
是基本原理
void funtion1(a[])// works
{
}
void function2(a[][4])//works
{
}
void function3(a[][])//doesn't work
{
}