C ++指针和2d数组输出

时间:2013-08-31 12:45:59

标签: c++ arrays pointers cout

我是C ++的新手,并且仍然对2d数组如何使用指针感到困惑。如果我有这个(例如格式):

int* anarray = anarrayfiller();
for (int a=0;a<10;a++) {
    for (int b=0;b<10;b++) {
         cout<<(char)anarray[a][b]; //Here's the error mentioned below
    }
    cout<<"\n";
}
//Later, outside main
int* anarrayfiller() {
    int anarray[10][10];
    //Populated here
    return &anarray;
}

这会在cout中的b下产生错误&lt;&lt;线: “表达式必须具有指针对象类型” 我只是检查如何搜索2d数组,我发现了这个: A pointer to 2d array 这表明实际上这个指针指向anarray [0]内的int数组,如果是这种情况,我必须在返回指针方面缺少一些东西 - 那么我不会再返回指向2d数组的指针每个指向anarray特定int的指针?我在这里很困惑。指针如何与2d数组一起工作?

1 个答案:

答案 0 :(得分:3)

这里有一些错误:

  1. 返回指向局部变量的指针。函数返回后,该变量先前占用的堆栈区域不再存在,或者由下一个函数使用。

  2. 当你有一个二维数组时,你返回一个指向整数的指针。最接近的是指向指针的指针。

  3. 您可以访问单指针,就好像它是一个双指针(指向指针或指向数组的指针或数组或数组),但事实并非如此。这就是你在指向的线上出错的原因。

  4. 但你不能使用指向指针的指针,因为数组数组(二维数组)的内存布局不同于指向指针的指针。参见例如this old answer of mine解释原因。

  5. 这可以通过在堆上动态创建数组来最容易地解决,作为指向指针的指针:

    int **anarrayfiller()
    {
        int **anarray = malloc(sizeof(int *) * 10);
    
        for (int i = 0; i < 10; ++i)
        {
            anarray[i] = malloc(sizeof(int) * 10);
    
            /* Populate here */
        }
    
        return anarray;
    }
    

    当您将问题标记为C ++时,您应该避免使用普通数组或指针,而不是std::vector(如果您需要动态添加)或std::array(如果你有一个固定的编译时大小):

    std::array<std::array<int, 10>, 10> anarrayfiller()
    {
        std::array<std::array<int, 10>, 10> anarray;
    
        // Populate arrays
    
        return anarray;
    }