Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 必须向列传递二维数组_C++_Arrays_Function - Fatal编程技术网

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
{
}