Я знаю, что должен это знать, но уже поздно, и мой мозг просто не соберет кусочки.
Это так просто, как может возникнуть вопрос:
У меня есть структура 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
Я чувствую, что как только кто-то отправит ответ, я пойду в лицо так сильно, что сломаю нос.
Если я правильно понял, тогда вам нужно что-то вроде этого
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";
}
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";
}
То, что вы хотите, это массив 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;
}