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

时间:2011-05-29 01:38:46

标签: c++

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

4 个答案:

答案 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/MrYKz

这是一种避免复杂数组引用语法的变体: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::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])中,我们访问将多维数组视为唯一行数组的顺序元素。