Указатель на массив указателей

Я знаю, что должен это знать, но уже поздно, и мой мозг просто не соберет кусочки.

Это так просто, как может возникнуть вопрос:

У меня есть структура item, Я хочу создать указатель на массив указателей на этот тип элемента.

Например.

struct item {
    int data;
    string moreData;
};

Я хочу иметь ArrayPointer эта точка на массив. Я хочу, чтобы этот массив содержал в каждом элементе указатель на элемент.

Как мне сделать это в C++ или, если быть более точным, куда мне нужно добавить число операторов разыменования? Я знаю, как объявлять базовые (однонаправленные) указатели, и довольно свободно их использую.

Мне нужна информация для следующих шагов, если это вообще возможно:

Объявление ArrayPointer,

Инициализация ArrayPointer с размером с.

Инициализация каждого элемента ArrayPointer с new item,

например:

for(int i = 0; i < s; i++)
    ArrayPointer[i] = // a new item

Я чувствую, что, как только кто-то отправляет ответ, я иду так сильно, что сломаю нос.

3 ответа

Решение

Если я правильно понял, тогда вам нужно что-то вроде этого

item **ArrayPointer = new item *[s];

for ( int i = 0; i < s; i++ )
{
    ArrayPointer[i] = new item; { i, "More Data" };
}

Или же

item **ArrayPointer = new item *[s];

for ( int i = 0; i < s; i++ )
{
    ArrayPointer[i] = new item;
    ArrayPointer[i]->data = i;
    ArrayPointer[i]->moreData = "More Data";
}

Освободить выделенную память вы можете в обратном порядке

for ( int i = 0; i < s; i++ )
{
    delete ArrayPointer[i];
}

delete [] ArrayPointer;

В противном случае, если s является константой, вы можете просто объявить массив указателей. Например

item * ArrayPointer[s];
for ( int i = 0; i < s; i++ )
{
    ArrayPointer[i]->data = i;
    ArrayPointer[i]->moreData = "More Data";
}

То, что вы хотите, это массив struct item *, которые являются указателями на item Структуры.

Массив таких указателей является struct item **,

#include <string>
#include <cstdlib>
using namespace std;

struct item {
    int data;
    string moreData;
};

struct item * newItem(int data, string moreData) {
    struct item *result = (struct item *) malloc(sizeof(struct item));
    result->data = data;
    result->moreData = moreData;
    return result;
}

struct item ** array;  // We don't know the size of the array in advance.

int main() {
    int arraySize = 3;  // We get this value from somewhere (user input?).
    array = (struct item **) malloc(3*sizeof(struct item *));
    // Now the array has been allocated. There is space for
    //  arraySize pointers.
    array[0] = newItem(5, "ant");    // Let's make some items. Note that
    array[1] = newItem(90, "bear");  //  newItem() returns a pointer to
    array[2] = newItem(25, "cat");   //  an item.
    return 0;
}

file.h

struct item {
    int data;
    string moreData;
};

item ** array;

file.cpp

array = new item*[s];

for(int i = 0; i < s; i++)
{
    array[i] = new item;
    array[i]->data = 10;
    array[i]->moreData = "data";
}
Другие вопросы по тегам