2013-08-31 3 views
-1

Я новичок в C++ и по-прежнему очень смущен тем, как работают 2d массивы с указателями. Если у меня есть это (в примере формата):C++ Pointer и 2d array output

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

Это приводит к ошибке при Ь в соиЬ < < линия: «Выражение должно иметь указатель на объект типа» я бы просто проверить, как искать через 2d массивы, и я нашел это: A pointer to 2d array Это говорит о том, что на самом деле этот указатель указывает на массив int внутри anarray [0], и если это так, я должен что-то пропускать с точки зрения возвращающих указателей - не будет Затем мне нужно вернуть указатель на 2d массив указателей, каждый из которых указывает на определенный int из anarray? Я здесь очень смущен. Как работают указатели с массивами 2d?

ответ

3

У вас есть несколько ошибок здесь:

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