C ++ Struct Array - 为什么它必须是一个指针?

时间:2017-05-28 20:14:46

标签: c++ arrays struct

我花了一些时间来弄清楚如何创建我创建的数据结构的数组。我最终认为它必须是一个指针,但为什么呢?

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

Food *foods = new Food[5]; // Why a pointer?

2 个答案:

答案 0 :(得分:4)

因为new[]分配了一块内存,并为该内存提供了一个指针。在new Food[5]的情况下,将有五个Food类型的对象的空间,每个对象都是默认构造的。你得到的指针是五个中的第一个Food对象。

您也可以使用

Food foods[5];

创建一个数组。

但是,创建"数组的首选方法是"在C ++中使用std::array或者如果你需要一个动态数组(或者需要它在堆上)std::vector

std::array<Food, 5> foods;  // Create a static fixed-size array of 5 Food objects

std::vector<Food> foods(5);  // Create a dynamic, expandable array of 5 Food object

答案 1 :(得分:0)

您不一定需要它作为指针,您可以轻松创建全局/本地数组:

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的自动指针也知道堆上的数组。