【问题标题】:C++ Pointer and 2d array outputtingC++ 指针和二维数组输出
【发布时间】:2013-09-04 02:10:56
【问题描述】:

我是 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;
}

这会在 coutA pointer to 2d array 这表明实际上这个指针指向anarray [0]中的整数数组,如果是这样的话,我必须在返回指针方面遗漏一些东西——我是否必须返回一个指向二维数组的指针每个指向数组中特定 int 的指针?我在这里很困惑。指针如何处理二维数组?

【问题讨论】:

    标签: c++ arrays pointers cout


    【解决方案1】:

    这里有一些错误:

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

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

    3. 您可以像访问双指针(指针到指针或指针到数组或数组或数组)一样访问单指针,但事实并非如此。这就是您在指向的行出现错误的原因。

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

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多