Мне потребовалось некоторое время, чтобы понять, как создать массив структуры данных, которую я создал. В конце концов я понял, что это должен быть указатель, но почему?

struct Food{
int weight;
double price;
string name;
};

Food *foods = new Food[5]; // Why a pointer?
-3
Splinxyy 28 Май 2017 в 23:14

2 ответа

Лучший ответ

Потому что new[] выделяет кусок памяти и дает вам указатель на эту память. В случае new Food[5] будет место для пяти объектов типа Food, каждый из которых создан по умолчанию. Вы получаете указатель на первый Food объект из пяти.

Вы также можете использовать

Food foods[5];

Создать массив.

Однако предпочтительным способом создания «массивов» в C ++ является использование {{X0} } или если вам нужен динамический массив (или он должен быть в куче)

Some programmer dude 28 Май 2017 в 20:23

Вам не обязательно нужен указатель, вы можете легко создать глобальный / локальный массив:

Food foods[5];

При работе с кучей массивы могут иметь различную длину:

Food *foods = new Food[std::rand() + 1];

Но вы должны явно удалить их как массивы:

delete[] foods; // otherwise they leak

Большую часть времени имеет смысл использовать контейнеры STL:

#include <vector>
#include <array>

std::vector<Food> foods(5, cheezeburger()); // in case we need more cheeseburgers
std::array<Food, 5> foods; // in case five cheeseburgers should be enough for everyone

Они сделают все раздражающее управление памятью за вас.

автоматические указатели STL также знают о массивах в куче.

0
bipll 28 Май 2017 в 20:22