-1

我是 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 下产生一个错误:“表达式必须具有指向对象类型的指针”我只是检查如何搜索 2d 数组,我发现了这个: A pointer to 2d array 这表明实际上这指针指向anarray [0]内的整数数组,如果是这种情况,我必须在返回指针方面遗漏一些东西 - 我是否必须返回一个指向每个指向的二维指针数组的指针来自数组的特定整数?我在这里很困惑。指针如何与二维数组一起工作?

4

1 回答 1

3

您在这里有一些错误:

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

  2. 您返回一个指向整数的指针,而您有一个二维数组。最接近的是指针对指针。

  3. 您访问事物单指针,就好像它是一个双指针(指针到指针或指针到数组或数组或数组),但它不是。这就是您在指向线处出现错误的原因。

  4. 但是您不能使用指向指针的指针,因为数组数组(二维数组)的内存布局与指向指针的指针不同。例如,请参阅我的这个旧答案以了解原因。

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

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;
}
于 2013-08-31T12:51:09.423 回答