C++ 错误:数组下标'int[int]'的类型无效
c++ error: invalid types 'int[int]' for array subscript
尝试学习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;
}
}
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/MrYKz
这里有一个变体,可以避免复杂的数组引用语法:http://ideone.com/GVkxk
如果大小是动态的,则不能使用任何一个模板版本。您只需要知道C和C++按行主顺序存储数组内容。
适用于可变大小的代码:http://ideone.com/kjHiR
由于theArray
是多维的,您应该在函数原型中指定其所有维度的边界(第一个除外):
void printArray(int theArray[][3], int numberOfRows, int numberOfColumns);
我知道这篇文章的发布日期,但为了完整性,也许为了将来参考,下面是另一个解决方案。尽管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]
)中,我们访问将多维数组视为唯一行数组的顺序元素。
如果将数组作为参数传递,则必须指定除第一个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;
}
}
- 为什么 int 类型的枚举类值不能用作 int
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 比较两个整数在C++中与未知 int 类型的相等性
- 二进制'operator+' 'int*'和'int*'类型的无效操作数
- 使用元编程选择 int 类型,将生成错误
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 初始化cv :: mat ::具有int类型的定义大小的人
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 为什么没有"int"类型声明时输出不同?
- 在大型程序中将长变量更改为 int 类型
- 无法将 int 类型转换为时间类型(我的类类型)
- C++:无法在按位函数后将 int 类型设置为非标量
- 无法分配给INT类型的成员[10]
- C++ cin 将字符串读取到 int 类型中返回 0
- 为什么 decltype((i)) 是引用类型,而 decltype(i+0) 是 int 类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 正在施放带有“ Int”类型的临时性