传递二维数组列是强制性的
Passing a 2-D array the column is mandatory
当传递二维数组时,我们必须指定列。如:
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],所以编译器必须知道如何计算这些对象的地址。
点击这里查看更多
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 在C++中初始化第一维大小未知的二维数组
- 传递二维数组列是强制性的