C++ 错误:数组下标'int[int]'的类型无效

c++ error: invalid types 'int[int]' for array subscript

本文关键字:int 类型 无效 错误 数组 C++ 下标      更新时间:2023-10-16

尝试学习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::vectorstd::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;
    }
}