简体   繁体   中英

C++ Pointer and 2d array outputting

I'm new to C++ and still really confused about how 2d arrays work with pointers. If I have this (in example format):

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

This produces an error under b in the cout<< line: "Expression must have pointer-to-object type" I would just check how to search through 2d arrays, and I found this: A pointer to 2d array Which suggests that actually this pointer points to the array of ints inside anarray[0], and if that's the case, I must be missing something in terms of returning pointers - wouldn't I then have to return a pointer to a 2d array of pointers that each points to a specific int from anarray? I'm pretty confused here. How do pointers work with 2d arrays?

You have a few errors here:

  1. You return a pointer to a local variable. After the function returns the stack area previously occupied by that variable no longer exist, or is used by the next function.

  2. You return a pointer to an integer, while you have a two-dimensional array. The closest would be a pointer-to-pointer.

  3. You access thing single-pointer as though it was a double-pointer (pointer-to-pointer or pointer-to-array or array-or-arrays), but it's not. That's the reason you get errors at the pointed to line.

  4. But you can't use pointer to pointer, as the memory layout of an array-of-arrays (a two-dimensional array) is different from a pointer-to-pointer. See eg this old answer of mine for an explanation of why.

This can be solved most easily by creating the array dynamically on the heap, as a pointer-to-pointer:

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

As you tagged your question as C++, you should actually avoid plain arrays or pointers in favor of either std::vector (if you need to add dynamically) or std::array (if you have a fixed compile-time size):

std::array<std::array<int, 10>, 10> anarrayfiller()
{
    std::array<std::array<int, 10>, 10> anarray;

    // Populate arrays

    return anarray;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM