尝试学习C ++并在数组上进行简单的练习。
基本上,我已经创建了一个多维数组,我想创建一个打印出值的函数。
Main()中的注释for循环工作正常,但是当我尝试将for循环转换为函数时,它不起作用,对于我的生活,我看不出原因。
#include <iostream>
using namespace std;
void printArray(int theArray[], int numberOfRows, int numberOfColumns);
int main()
{
int sally[2][3] = {{2,3,4},{8,9,10}};
printArray(sally,2,3);
// for(int rows = 0; rows < 2; rows++){
// for(int columns = 0; columns < 3; columns++){
// cout << sally[rows][columns] << " ";
// }
// cout << endl;
// }
}
void printArray(int theArray[], int numberOfRows, int numberOfColumns){
for(int x = 0; x < numberOfRows; x++){
for(int y = 0; y < numberOfColumns; y++){
cout << theArray[x][y] << " ";
}
cout << endl;
}
}
答案 0 :(得分:5)
C ++从C继承其语法,并努力在语法匹配时保持向后兼容性。所以传递数组就像C一样:长度信息丢失了。
但是,C ++确实提供了一种使用引用自动传递长度信息的方法(没有向后兼容性问题,C没有引用):
template<int numberOfRows, int numberOfColumns>
void printArray(int (&theArray)[numberOfRows][numberOfColumns])
{
for(int x = 0; x < numberOfRows; x++){
for(int y = 0; y < numberOfColumns; y++){
cout << theArray[x][y] << " ";
}
cout << endl;
}
}
这是一种避免复杂数组引用语法的变体:http://ideone.com/GVkxk
如果大小是动态的,则不能使用任何模板版本。您只需要知道C和C ++以行主顺序存储数组内容。
使用可变大小的代码:http://ideone.com/kjHiR
答案 1 :(得分:2)
由于theArray
是多维的,您应该在函数原型中指定其所有维度的边界(第一个除外):
void printArray(int theArray[][3], int numberOfRows, int numberOfColumns);
答案 2 :(得分:0)
如果将数组作为参数传递,则必须指定除第一个dim之外的维的大小。编译器需要那些来计算数组中每个元素的偏移量。假设您可以printArray
喜欢
void printArray(int theArray[][3], int numberOfRows, int numberOfColumns){
for(int x = 0; x < numberOfRows; x++){
for(int y = 0; y < numberOfColumns; y++){
cout << theArray[x][y] << " ";
}
cout << endl;
}
}
答案 3 :(得分:0)
我知道这篇文章的发布日期,但仅仅为了完整性而且大部分是为了将来的参考,这是另一种解决方案。虽然C ++提供了许多标准库工具(参见std::vector
或std::array
),但与内置数组内在的低级概念相比,这使得程序员生活更轻松,如果你还需要调用你的printArray
是这样的:
printArray(sally, 2, 3);
您可以通过这种方式重新定义功能:
void printArray(int* theArray, int numberOfRows, int numberOfColumns){
for(int x = 0; x < numberOfRows; x++){
for(int y = 0; y < numberOfColumns; y++){
cout << theArray[x * numberOfColumns + y] << " ";
}
cout << endl;
}
}
特别要注意第一个参数和下标操作:
该函数接受一个指针,因此您将多维数组的名称也传递给它的第一个元素。
在下标操作(theArray[x * numberOfColumns + y]
)中,我们访问将多维数组视为唯一行数组的顺序元素。