传递二维数组列是强制性的

Passing a 2-D array the column is mandatory

本文关键字:强制性 二维数组      更新时间:2023-10-16

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

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

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

如果不指定二维数组,则不能传递二维数组,否则,参数"a"将衰减为指针,编译器需要知道二维数组计算偏移量的时间(原因是二维数组在内存中存储为1D)。因此,编译器必须知道*a的大小,这就要求给出第二次维数。你可以使用向量的向量来代替二维数组

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

C风格的数组并不像你想象的那样工作。把它们想象成一块内存,维度告诉编译器从原始地址偏移多远。

int a[]基本上是一个指针,每个元素都是int型,这意味着a[1]相当于*(a + 1),其中每个1都是sizeof(int)字节。简单地说,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,应该使用vector。使用std::vector<std::vector<int> > a是相当安全的。你仍然可以得到一个[2][1]。

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

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

address_of_a + (x * SECOND_SIZE + y)

想象现在你想要

[2] [3]

编译器必须计算:

address_of_a + (2 * SECOND_SIZE + 3)

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

点击这里查看更多